Mohammedallyl commited on
Commit
047073b
·
verified ·
1 Parent(s): 68f4a9c

Upload 93 files

Browse files
.gitattributes CHANGED
@@ -23,3 +23,19 @@ assets/Videos/nano.mp4 filter=lfs diff=lfs merge=lfs -text
23
  indoor.jpg filter=lfs diff=lfs merge=lfs -text
24
  website-demo-image/desktop.png filter=lfs diff=lfs merge=lfs -text
25
  website-demo-image/mobile.png filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  indoor.jpg filter=lfs diff=lfs merge=lfs -text
24
  website-demo-image/desktop.png filter=lfs diff=lfs merge=lfs -text
25
  website-demo-image/mobile.png filter=lfs diff=lfs merge=lfs -text
26
+ assets/Certifcations/AI.jpg filter=lfs diff=lfs merge=lfs -text
27
+ assets/Certifcations/SQL.png filter=lfs diff=lfs merge=lfs -text
28
+ assets/Certifcations/Ubunto.jpg filter=lfs diff=lfs merge=lfs -text
29
+ assets/images/Projects/Tableau[[:space:]]Pro.png filter=lfs diff=lfs merge=lfs -text
30
+ assets/images/Projects/Tableau[[:space:]]Pro2.png filter=lfs diff=lfs merge=lfs -text
31
+ assets/Videos/lab.mp4 filter=lfs diff=lfs merge=lfs -text
32
+ assets/Videos/lab5.mp4 filter=lfs diff=lfs merge=lfs -text
33
+ assets/Videos/tableau.mp4 filter=lfs diff=lfs merge=lfs -text
34
+ ProjectViewr/assets/apl1.png filter=lfs diff=lfs merge=lfs -text
35
+ ProjectViewr/assets/apl3.png filter=lfs diff=lfs merge=lfs -text
36
+ ProjectViewr/assets/apl4.png filter=lfs diff=lfs merge=lfs -text
37
+ ProjectViewr/assets/im1.png filter=lfs diff=lfs merge=lfs -text
38
+ ProjectViewr/assets/im2.png filter=lfs diff=lfs merge=lfs -text
39
+ ProjectViewr/assets/im3.png filter=lfs diff=lfs merge=lfs -text
40
+ ProjectViewr/assets/im4.png filter=lfs diff=lfs merge=lfs -text
41
+ ProjectViewr/assets/im5.png filter=lfs diff=lfs merge=lfs -text
CirtifiCationsViewr/CertificatesViewer.html CHANGED
@@ -4,7 +4,7 @@
4
  <meta charset="UTF-8">
5
  <title>Certificate Details</title>
6
 
7
- <!-- Include Marked library -->
8
  <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
9
 
10
  <style>
@@ -13,18 +13,16 @@
13
  --card: #1f1f1f;
14
  --accent: #f5c542;
15
  --text: #e0e0e0;
16
- --muted: #b0b0b0;
17
  --divider: #2a2a2a;
18
- --shadow: rgba(0, 0, 0, 0.5);
19
- --font-primary: "Segoe UI", "Roboto", sans-serif;
20
  }
21
 
22
  body {
23
  margin: 0;
24
  background: var(--bg);
25
  color: var(--text);
26
- font-family: var(--font-primary);
27
- line-height: 1.6;
28
  }
29
 
30
  .page {
@@ -36,125 +34,72 @@ body {
36
  }
37
 
38
  .container {
39
- width: 100%;
40
  max-width: 900px;
 
41
  background: linear-gradient(145deg, #1f1f1f, #222);
42
- border-radius: 24px;
43
  padding: 50px 40px;
 
44
  box-shadow: 0 10px 30px var(--shadow);
45
- transition: transform 0.3s ease;
46
  }
47
 
48
- .container:hover {
49
- transform: translateY(-5px);
50
- }
51
-
52
- /* === TITLE === */
53
  h1 {
54
- margin: 0;
55
- font-size: 36px;
56
- font-weight: 700;
57
  text-align: center;
58
- letter-spacing: 1px;
59
  color: var(--accent);
60
- text-shadow: 1px 1px 2px var(--shadow);
61
  }
62
 
63
- /* === SECTIONS === */
64
  .section {
65
- margin-top: 50px;
66
  }
67
 
68
  .section-title {
69
  text-align: center;
70
- font-size: 16px;
71
- font-weight: 600;
72
- letter-spacing: 2px;
73
  text-transform: uppercase;
74
  color: var(--accent);
 
75
  margin-bottom: 20px;
 
76
  }
77
 
78
  .divider {
79
  height: 1px;
80
  background: var(--divider);
81
  margin: 40px 0;
82
- opacity: 0.6;
83
  }
84
 
85
- /* === IMAGE === */
86
  .certificate-image {
87
  display: flex;
88
  justify-content: center;
89
  }
90
 
91
  .certificate-image img {
92
- width: 100%;
93
  max-width: 720px;
 
94
  border-radius: 20px;
95
- object-fit: contain;
96
  box-shadow: 0 6px 20px var(--shadow);
97
- transition: transform 0.3s ease;
98
- }
99
-
100
- .certificate-image img:hover {
101
- transform: scale(1.02);
102
  }
103
 
104
- /* === CONTENT === */
105
  .content {
106
  max-width: 760px;
107
- margin: 0 auto;
108
- color: var(--text);
109
- font-size: 16px;
110
  line-height: 1.8;
111
- text-align: left;
112
- word-wrap: break-word;
113
  }
114
 
115
- /* Markdown styling */
116
- .content h1, .content h2, .content h3, .content h4 {
 
117
  color: var(--accent);
118
  text-align: center;
119
- margin-bottom: 10px;
120
- }
121
-
122
- .content p {
123
- margin-bottom: 1em;
124
- }
125
-
126
- .content ul {
127
- padding-left: 1.2em;
128
- margin-bottom: 1em;
129
- }
130
-
131
- .content li {
132
- margin-bottom: 0.6em;
133
  }
134
 
135
  .content a {
136
  color: var(--accent);
137
- text-decoration: none;
138
  }
139
 
140
- .content a:hover {
141
- text-decoration: underline;
142
- }
143
-
144
- /* === MOBILE === */
145
  @media (max-width: 768px) {
146
  .container {
147
  padding: 30px 20px;
148
- border-radius: 16px;
149
- }
150
-
151
- .content {
152
- font-size: 15px;
153
- text-align: left;
154
- }
155
-
156
- h1 {
157
- font-size: 28px;
158
  }
159
  }
160
  </style>
@@ -165,12 +110,10 @@ h1 {
165
  <div class="page">
166
  <div class="container">
167
 
168
- <!-- TITLE -->
169
- <h1 id="title"></h1>
170
 
171
  <div class="divider"></div>
172
 
173
- <!-- CERTIFICATE IMAGE -->
174
  <div class="section">
175
  <div class="section-title">Certificate</div>
176
  <div class="certificate-image" id="image"></div>
@@ -178,9 +121,8 @@ h1 {
178
 
179
  <div class="divider"></div>
180
 
181
- <!-- CONTENT -->
182
  <div class="section">
183
- <div class="section-title">Certificate Details</div>
184
  <div class="content" id="content"></div>
185
  </div>
186
 
@@ -189,32 +131,54 @@ h1 {
189
 
190
  <script>
191
  const params = new URLSearchParams(window.location.search);
192
- const jsonPath = params.get("data");
193
-
194
- if (!jsonPath) {
195
- document.body.innerHTML = "<p style='color:red'>No certificate data provided.</p>";
196
- throw new Error("Missing data query");
197
- }
198
-
199
- fetch(jsonPath)
200
- .then(res => res.json())
201
- .then(cert => renderCertificate(cert))
202
- .catch(() => {
203
- document.body.innerHTML = "<p style='color:red'>Failed to load certificate data.</p>";
 
 
 
 
 
204
  });
205
 
206
- function renderCertificate(cert) {
207
- document.getElementById("title").textContent = cert.title;
 
 
 
 
 
208
 
209
- document.getElementById("image").innerHTML = `
210
- <img src="${cert.imagePath}" alt="${cert.title}">
211
- `;
 
 
212
 
213
- // If content is an array, join it; else treat as string
214
- const markdown = Array.isArray(cert.content) ? cert.content.join('\n') : cert.content;
215
- document.getElementById("content").innerHTML = marked.parse(markdown);
 
 
 
 
 
 
 
 
 
 
216
  }
217
  </script>
218
 
219
  </body>
220
- </html>
 
4
  <meta charset="UTF-8">
5
  <title>Certificate Details</title>
6
 
7
+ <!-- Markdown Parser -->
8
  <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
9
 
10
  <style>
 
13
  --card: #1f1f1f;
14
  --accent: #f5c542;
15
  --text: #e0e0e0;
 
16
  --divider: #2a2a2a;
17
+ --shadow: rgba(0,0,0,0.5);
18
+ --font: "Segoe UI", Roboto, sans-serif;
19
  }
20
 
21
  body {
22
  margin: 0;
23
  background: var(--bg);
24
  color: var(--text);
25
+ font-family: var(--font);
 
26
  }
27
 
28
  .page {
 
34
  }
35
 
36
  .container {
 
37
  max-width: 900px;
38
+ width: 100%;
39
  background: linear-gradient(145deg, #1f1f1f, #222);
 
40
  padding: 50px 40px;
41
+ border-radius: 24px;
42
  box-shadow: 0 10px 30px var(--shadow);
 
43
  }
44
 
 
 
 
 
 
45
  h1 {
 
 
 
46
  text-align: center;
 
47
  color: var(--accent);
48
+ margin-bottom: 30px;
49
  }
50
 
 
51
  .section {
52
+ margin-top: 40px;
53
  }
54
 
55
  .section-title {
56
  text-align: center;
 
 
 
57
  text-transform: uppercase;
58
  color: var(--accent);
59
+ letter-spacing: 2px;
60
  margin-bottom: 20px;
61
+ font-size: 14px;
62
  }
63
 
64
  .divider {
65
  height: 1px;
66
  background: var(--divider);
67
  margin: 40px 0;
 
68
  }
69
 
 
70
  .certificate-image {
71
  display: flex;
72
  justify-content: center;
73
  }
74
 
75
  .certificate-image img {
 
76
  max-width: 720px;
77
+ width: 100%;
78
  border-radius: 20px;
 
79
  box-shadow: 0 6px 20px var(--shadow);
 
 
 
 
 
80
  }
81
 
82
+ /* Markdown content */
83
  .content {
84
  max-width: 760px;
85
+ margin: auto;
 
 
86
  line-height: 1.8;
 
 
87
  }
88
 
89
+ .content h1,
90
+ .content h2,
91
+ .content h3 {
92
  color: var(--accent);
93
  text-align: center;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
  }
95
 
96
  .content a {
97
  color: var(--accent);
 
98
  }
99
 
 
 
 
 
 
100
  @media (max-width: 768px) {
101
  .container {
102
  padding: 30px 20px;
 
 
 
 
 
 
 
 
 
 
103
  }
104
  }
105
  </style>
 
110
  <div class="page">
111
  <div class="container">
112
 
113
+ <h1 id="title">Loading...</h1>
 
114
 
115
  <div class="divider"></div>
116
 
 
117
  <div class="section">
118
  <div class="section-title">Certificate</div>
119
  <div class="certificate-image" id="image"></div>
 
121
 
122
  <div class="divider"></div>
123
 
 
124
  <div class="section">
125
+ <div class="section-title">Description</div>
126
  <div class="content" id="content"></div>
127
  </div>
128
 
 
131
 
132
  <script>
133
  const params = new URLSearchParams(window.location.search);
134
+ const jsonUrl = params.get("data");
135
+
136
+ if (!jsonUrl) {
137
+ document.body.innerHTML = "<p style='color:red'>Missing ?data=certificate.json</p>";
138
+ throw new Error("No data parameter");
139
+ }
140
+
141
+ // Load certificate JSON
142
+ fetch(jsonUrl)
143
+ .then(res => {
144
+ if (!res.ok) throw new Error("JSON load failed");
145
+ return res.json();
146
+ })
147
+ .then(cert => render(cert))
148
+ .catch(err => {
149
+ document.body.innerHTML = "<p style='color:red'>Failed to load certificate data</p>";
150
+ console.error(err);
151
  });
152
 
153
+ function render(cert) {
154
+ document.getElementById("title").textContent = cert.title || "Certificate";
155
+
156
+ if (cert.imagePath) {
157
+ document.getElementById("image").innerHTML =
158
+ `<img src="${cert.imagePath}" alt="Certificate Image">`;
159
+ }
160
 
161
+ if (!cert.description) {
162
+ document.getElementById("content").innerHTML =
163
+ "<p style='color:red'>No README path provided</p>";
164
+ return;
165
+ }
166
 
167
+ // Fetch README.md file
168
+ fetch(cert.description)
169
+ .then(res => {
170
+ if (!res.ok) throw new Error("Markdown load failed");
171
+ return res.text();
172
+ })
173
+ .then(md => {
174
+ document.getElementById("content").innerHTML = marked.parse(md);
175
+ })
176
+ .catch(() => {
177
+ document.getElementById("content").innerHTML =
178
+ "<p style='color:red'>Failed to load README file</p>";
179
+ });
180
  }
181
  </script>
182
 
183
  </body>
184
+ </html>
CirtifiCationsViewr/data/C1.json CHANGED
@@ -1,5 +1,5 @@
1
  {
2
- "title": "Deep Learning Specialization",
3
- "imagePath": "../assets/Certifcations/Mohammed.jpg",
4
- "content": "# 🎓 I Completed the Digitera Program!\n\nI’m thrilled to share that I have successfully completed the **Digitera Program**, marking a major step in mastering digital skills and becoming *Ready for Tomorrow*.\n\nThroughout this hands-on journey, I built powerful competencies that employers highly value, while applying them in practical, real-world exercises.\n\n## 📅 Training Highlights\nAll sessions were conducted online, and I actively participated in every session. The full training covered the following topics:\n\n- **Day 1:** Digital Productivity\n- **Day 2:** Data Literacy & Dashboards\n- **Day 3:** Automation for Daily Work\n- **Day 4:** AI for Productivity & Creativity\n- **Day 5:** Data Storytelling & Digital Presence\n- **Day 6:** Capstone Project & Digital Roadmap\n\nI also stayed connected through the official WhatsApp group to get updates, instructions, and interact with peers and mentors.\n\n## 💡 What I Gained\nCompleting this program enhanced my digital skills, strengthened my problem-solving abilities, and prepared me to apply practical tools to real-world challenges. It was an invaluable experience that helped me grow as a digital professional.\n\n*— Proud to have completed the Digitera Program and excited to apply what I’ve learned!*"
5
  }
 
1
  {
2
+ "title": "AI :12 Month Learning Journey ",
3
+ "imagePath": "../assets/Certifcations/AI.jpg",
4
+ "description": "./data/ReadMeFiles/C1.Readme"
5
  }
CirtifiCationsViewr/data/C2.json CHANGED
@@ -1,5 +1,5 @@
1
  {
2
  "title": "Deep Learning Specialization",
3
- "imagePath": "../assets/Certifcations/Excle.jpg",
4
- "content": "# Microsoft Excel Certification\n\nThis certificate validates my proficiency in **Microsoft Excel** for data analysis and business reporting. It demonstrates essential to advanced Excel skills used in real-world data workflows.\n\n## Key Skills Covered\n\n- **Formulas, Functions, and Logical Expressions:** Applying Excel functions to analyze and manipulate data efficiently.\n- **Data Cleaning, Sorting, and Filtering:** Preparing data for accurate analysis and reporting.\n- **Charts and Dashboards:** Creating professional visualizations for clear insights.\n- **Pivot Tables and Pivot Charts:** Summarizing complex datasets effectively.\n- **Conditional Formatting:** Highlighting trends and key data points.\n- **Large Dataset Management:** Efficient handling of high-volume data.\n\nThis certification showcases my ability to transform raw data into meaningful insights using Excel, supporting **data-driven decision-making** in business and analytical environments."
5
  }
 
1
  {
2
  "title": "Deep Learning Specialization",
3
+ "imagePath": "../assets/Certifcations/SQL.png",
4
+ "description": "./data/ReadMeFiles/C2.Readme"
5
  }
ProjectViewr/ProjectViewr.html CHANGED
@@ -1,76 +1,76 @@
1
  <!DOCTYPE html>
2
  <html lang="en">
3
  <head>
4
- <meta charset="UTF-8">
 
5
  <title>Project Details</title>
6
 
7
  <!-- Iconify -->
8
  <script src="https://code.iconify.design/3/3.1.1/iconify.min.js"></script>
9
- <!-- Marked.js for Markdown parsing -->
 
10
  <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
11
 
12
  <style>
13
  :root {
14
- --bg: #121212;
15
- --card: #1f1f1f;
16
  --accent: #f5c542;
17
- --text: #e0e0e0;
18
- --muted: #b0b0b0;
19
  --divider: #2a2a2a;
20
- --shadow: rgba(0, 0, 0, 0.5);
21
- --font-primary: "Segoe UI", "Roboto", sans-serif;
 
 
22
  }
23
 
 
 
24
  body {
25
  margin: 0;
26
  background: var(--bg);
27
  color: var(--text);
28
- font-family: var(--font-primary);
29
- line-height: 1.6;
30
  }
31
 
32
  .page {
33
  min-height: 100vh;
34
  display: flex;
35
  justify-content: center;
36
- align-items: center;
37
- padding: 40px 16px;
38
  }
39
 
40
  .container {
41
  width: 100%;
42
- max-width: 900px;
43
- background: linear-gradient(145deg, #1f1f1f, #222);
44
- border-radius: 24px;
45
  padding: 50px 40px;
46
- box-shadow: 0 10px 30px var(--shadow);
47
- transition: transform 0.3s ease;
48
  }
49
 
50
- .container:hover {
51
- transform: translateY(-5px);
 
52
  }
53
 
54
- /* === HEADER === */
55
  h1 {
56
  margin: 0;
57
- font-size: 36px;
58
- font-weight: 700;
59
  text-align: center;
60
- letter-spacing: 1px;
61
  color: var(--accent);
62
- text-shadow: 1px 1px 2px var(--shadow);
63
  }
64
 
65
- /* === SECTIONS === */
66
  .section {
67
  margin-top: 50px;
68
  }
69
 
70
  .section-title {
71
  text-align: center;
72
- font-size: 16px;
73
- font-weight: 600;
74
  letter-spacing: 2px;
75
  text-transform: uppercase;
76
  color: var(--accent);
@@ -84,20 +84,16 @@ h1 {
84
  opacity: 0.6;
85
  }
86
 
87
- /* === CATEGORY === */
88
  .category {
89
  text-align: center;
90
- font-size: 16px;
91
  color: var(--muted);
92
- font-weight: 500;
93
  }
94
 
95
- /* === TOOLS === */
96
  .tools {
97
  display: flex;
98
  justify-content: center;
99
  flex-wrap: wrap;
100
- gap: 28px;
101
  }
102
 
103
  .tool {
@@ -106,22 +102,17 @@ h1 {
106
  align-items: center;
107
  font-size: 14px;
108
  color: var(--muted);
 
109
  }
110
 
 
 
111
  .tool .iconify {
112
- font-size: 42px;
113
  color: var(--accent);
114
  margin-bottom: 8px;
115
- transition: transform 0.3s ease, color 0.3s ease;
116
  }
117
 
118
- .tool:hover .iconify {
119
- transform: scale(1.3) rotate(15deg);
120
- color: #ffd84d;
121
- cursor:pointer;
122
- }
123
-
124
- /* === MEDIA === */
125
  .media {
126
  display: flex;
127
  justify-content: center;
@@ -130,66 +121,59 @@ h1 {
130
  .media video,
131
  .media img {
132
  width: 100%;
133
- max-width: 720px;
134
- aspect-ratio: 16 / 9;
135
- border-radius: 20px;
136
- object-fit: cover;
137
- box-shadow: 0 6px 20px var(--shadow);
138
- transition: transform 0.3s ease;
139
  }
140
 
141
- .media img:hover,
142
- .media video:hover {
143
- transform: scale(1.02);
144
  }
145
 
146
- /* === DESCRIPTION === */
147
- .description {
148
- max-width: 760px;
149
- margin: 0 auto;
150
- color: var(--text);
151
- font-size: 16px;
152
- line-height: 1.8;
153
- text-align: left;
154
- word-wrap: break-word;
155
  }
156
 
157
- /* === MOBILE === */
158
- @media (max-width: 768px) {
159
- .container {
160
- padding: 30px 20px;
161
- border-radius: 16px;
162
- }
163
 
164
- h1 {
165
- font-size: 28px;
166
- }
 
167
 
168
- .description {
169
- max-width: 100%;
170
- font-size: 15px;
171
- }
 
 
 
 
172
  }
173
  </style>
174
  </head>
175
-
176
  <body>
177
 
178
  <div class="page">
179
  <div class="container">
180
 
181
- <!-- TITLE -->
182
  <h1 id="title"></h1>
183
 
184
- <!-- CATEGORY -->
185
  <div class="section">
186
- <div class="section-title">Category Type</div>
187
  <div class="category" id="category"></div>
188
  </div>
189
 
190
  <div class="divider"></div>
191
 
192
- <!-- TOOLS -->
193
  <div class="section">
194
  <div class="section-title">Tools Used</div>
195
  <div class="tools" id="tools"></div>
@@ -197,86 +181,136 @@ h1 {
197
 
198
  <div class="divider"></div>
199
 
200
- <!-- MEDIA -->
201
  <div class="section">
202
- <div class="section-title">Project Preview</div>
203
  <div class="media" id="media"></div>
204
  </div>
205
 
206
  <div class="divider"></div>
207
 
208
- <!-- DESCRIPTION -->
209
  <div class="section">
210
- <div class="section-title">Project Description</div>
211
- <div class="description" id="description"></div>
 
 
212
  </div>
213
 
214
  </div>
215
  </div>
216
 
217
  <script>
218
- const params = new URLSearchParams(window.location.search);
219
- const jsonPath = params.get("data");
220
-
221
- if (!jsonPath) {
222
- document.body.innerHTML = "<p style='color:red'>No project data provided.</p>";
223
- throw new Error("Missing data query");
224
- }
225
-
226
- fetch(jsonPath)
227
- .then(res => res.json())
228
- .then(project => renderProject(project));
229
-
230
  const toolIcons = {
231
  python: "logos:python",
232
- fastapi: "logos:fastapi-icon",
233
  tensorflow: "logos:tensorflow",
234
- pytorch: "logos:pytorch-icon",
235
  opencv: "logos:opencv",
236
- wifi: "mdi:wifi",
237
- powerbi: "logos:microsoft-power-bi",
238
- n8n: "simple-icons:n8n",
239
- docker: "logos:docker-icon",
240
- javascript: "logos:javascript",
241
  react: "logos:react",
242
- linux: "logos:linux-tux",
 
 
243
  };
244
 
245
- function renderProject(p) {
246
- document.getElementById("title").textContent = p.name;
247
- document.getElementById("category").textContent = p.category;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
248
 
249
- // Use marked.js to render Markdown
250
- document.getElementById("description").innerHTML = marked.parse(p.description);
251
 
252
- renderMedia(p);
253
- renderTools(p.tools);
 
 
 
 
 
 
 
 
 
 
 
254
  }
255
 
256
- function renderMedia(p) {
257
  const media = document.getElementById("media");
258
- media.innerHTML = p.displayType === "video"
259
- ? `<video src="${p.filePath}" controls></video>`
260
- : `<img src="${p.filePath}" alt="${p.name}">`;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
261
  }
262
 
263
- function renderTools(toolsText) {
264
- const toolsContainer = document.getElementById("tools");
265
- const tools = toolsText.split(",").map(t => t.trim().toLowerCase());
266
-
267
- tools.forEach(tool => {
268
- const icon = toolIcons[tool] || "mdi:tools";
269
-
270
- const el = document.createElement("div");
271
- el.className = "tool";
272
- el.innerHTML = `
273
- <span class="iconify" data-icon="${icon}"></span>
274
- <span>${tool}</span>
275
- `;
276
- toolsContainer.appendChild(el);
277
- });
278
  }
279
  </script>
280
 
281
  </body>
282
- </html>
 
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>Project Details</title>
7
 
8
  <!-- Iconify -->
9
  <script src="https://code.iconify.design/3/3.1.1/iconify.min.js"></script>
10
+
11
+ <!-- Marked.js -->
12
  <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
13
 
14
  <style>
15
  :root {
16
+ --bg: #0f0f0f;
17
+ --card: #1a1a1a;
18
  --accent: #f5c542;
19
+ --text: #e5e5e5;
20
+ --muted: #9e9e9e;
21
  --divider: #2a2a2a;
22
+ --error: #ff5252;
23
+ --radius: 20px;
24
+ --shadow: 0 10px 30px rgba(0,0,0,0.6);
25
+ --font: "Segoe UI", Roboto, sans-serif;
26
  }
27
 
28
+ * { box-sizing: border-box; }
29
+
30
  body {
31
  margin: 0;
32
  background: var(--bg);
33
  color: var(--text);
34
+ font-family: var(--font);
35
+ line-height: 1.7;
36
  }
37
 
38
  .page {
39
  min-height: 100vh;
40
  display: flex;
41
  justify-content: center;
42
+ padding: 60px 16px;
 
43
  }
44
 
45
  .container {
46
  width: 100%;
47
+ max-width: 1000px;
48
+ background: var(--card);
49
+ border-radius: var(--radius);
50
  padding: 50px 40px;
51
+ box-shadow: var(--shadow);
52
+ animation: fadeIn 0.4s ease;
53
  }
54
 
55
+ @keyframes fadeIn {
56
+ from { opacity: 0; transform: translateY(10px); }
57
+ to { opacity: 1; transform: translateY(0); }
58
  }
59
 
 
60
  h1 {
61
  margin: 0;
 
 
62
  text-align: center;
63
+ font-size: 36px;
64
  color: var(--accent);
 
65
  }
66
 
 
67
  .section {
68
  margin-top: 50px;
69
  }
70
 
71
  .section-title {
72
  text-align: center;
73
+ font-size: 14px;
 
74
  letter-spacing: 2px;
75
  text-transform: uppercase;
76
  color: var(--accent);
 
84
  opacity: 0.6;
85
  }
86
 
 
87
  .category {
88
  text-align: center;
 
89
  color: var(--muted);
 
90
  }
91
 
 
92
  .tools {
93
  display: flex;
94
  justify-content: center;
95
  flex-wrap: wrap;
96
+ gap: 30px;
97
  }
98
 
99
  .tool {
 
102
  align-items: center;
103
  font-size: 14px;
104
  color: var(--muted);
105
+ transition: transform 0.3s;
106
  }
107
 
108
+ .tool:hover { transform: translateY(-4px); }
109
+
110
  .tool .iconify {
111
+ font-size: 40px;
112
  color: var(--accent);
113
  margin-bottom: 8px;
 
114
  }
115
 
 
 
 
 
 
 
 
116
  .media {
117
  display: flex;
118
  justify-content: center;
 
121
  .media video,
122
  .media img {
123
  width: 100%;
124
+ max-width: 750px;
125
+ border-radius: var(--radius);
126
+ box-shadow: var(--shadow);
 
 
 
127
  }
128
 
129
+ .description {
130
+ max-width: 800px;
131
+ margin: auto;
132
  }
133
 
134
+ .description h1,
135
+ .description h2,
136
+ .description h3 {
137
+ color: var(--accent);
 
 
 
 
 
138
  }
139
 
140
+ .description pre {
141
+ background: #111;
142
+ padding: 15px;
143
+ border-radius: 10px;
144
+ overflow-x: auto;
145
+ }
146
 
147
+ .loading {
148
+ text-align: center;
149
+ color: var(--muted);
150
+ }
151
 
152
+ .error {
153
+ text-align: center;
154
+ color: var(--error);
155
+ }
156
+
157
+ @media (max-width: 768px) {
158
+ .container { padding: 30px 20px; }
159
+ h1 { font-size: 28px; }
160
  }
161
  </style>
162
  </head>
 
163
  <body>
164
 
165
  <div class="page">
166
  <div class="container">
167
 
 
168
  <h1 id="title"></h1>
169
 
 
170
  <div class="section">
171
+ <div class="section-title">Category</div>
172
  <div class="category" id="category"></div>
173
  </div>
174
 
175
  <div class="divider"></div>
176
 
 
177
  <div class="section">
178
  <div class="section-title">Tools Used</div>
179
  <div class="tools" id="tools"></div>
 
181
 
182
  <div class="divider"></div>
183
 
 
184
  <div class="section">
185
+ <div class="section-title">Preview</div>
186
  <div class="media" id="media"></div>
187
  </div>
188
 
189
  <div class="divider"></div>
190
 
 
191
  <div class="section">
192
+ <div class="section-title">Description</div>
193
+ <div id="description" class="description loading">
194
+ Loading README...
195
+ </div>
196
  </div>
197
 
198
  </div>
199
  </div>
200
 
201
  <script>
 
 
 
 
 
 
 
 
 
 
 
 
202
  const toolIcons = {
203
  python: "logos:python",
 
204
  tensorflow: "logos:tensorflow",
 
205
  opencv: "logos:opencv",
206
+ fastapi: "logos:fastapi-icon",
207
+ nextjs: "logos:nextjs-icon",
 
 
 
208
  react: "logos:react",
209
+ javascript: "logos:javascript",
210
+ docker: "logos:docker-icon",
211
+ linux: "logos:linux-tux"
212
  };
213
 
214
+ document.addEventListener("DOMContentLoaded", init);
215
+
216
+ async function init() {
217
+ const params = new URLSearchParams(window.location.search);
218
+ const dataFile = params.get("data"); // e.g., "data/Pro1.json"
219
+
220
+ if (!dataFile) return showError("No project file provided.");
221
+
222
+ let project;
223
+ try {
224
+ const res = await fetch(dataFile);
225
+ if (!res.ok) throw new Error();
226
+ project = await res.json();
227
+ } catch {
228
+ return showError("Failed to load project JSON.");
229
+ }
230
+
231
+ renderBasicInfo(project);
232
+ renderMedia(project);
233
+ renderTools(project.tools);
234
 
235
+ if (!project.description) return showError("README file path missing.");
 
236
 
237
+ const descPath = project.description.trim();
238
+ if (!descPath.endsWith(".md") && !descPath.endsWith(".readme")) {
239
+ return showError("Description must be a .md or .readme file.");
240
+ }
241
+
242
+ await loadReadme(descPath);
243
+ }
244
+
245
+ function renderBasicInfo(project) {
246
+ document.getElementById("title").textContent =
247
+ project.name || "Untitled Project";
248
+ document.getElementById("category").textContent =
249
+ project.category || "N/A";
250
  }
251
 
252
+ function renderMedia(project) {
253
  const media = document.getElementById("media");
254
+ media.innerHTML = "";
255
+
256
+ if (!project.filePath) return;
257
+
258
+ if (project.displayType === "video") {
259
+ const video = document.createElement("video");
260
+ video.src = project.filePath;
261
+ video.controls = true;
262
+ media.appendChild(video);
263
+ } else {
264
+ const img = document.createElement("img");
265
+ img.src = project.filePath;
266
+ img.alt = project.name || "Project preview";
267
+ media.appendChild(img);
268
+ }
269
+ }
270
+
271
+ function renderTools(toolsText = "") {
272
+ const container = document.getElementById("tools");
273
+ container.innerHTML = "";
274
+
275
+ toolsText
276
+ .split(/[, ]+/)
277
+ .filter(Boolean)
278
+ .forEach(tool => {
279
+ const key = tool.toLowerCase();
280
+ const icon = toolIcons[key] || "mdi:tools";
281
+
282
+ const el = document.createElement("div");
283
+ el.className = "tool";
284
+ el.innerHTML = `
285
+ <span class="iconify" data-icon="${icon}"></span>
286
+ <span>${tool}</span>
287
+ `;
288
+ container.appendChild(el);
289
+ });
290
+ }
291
+
292
+ async function loadReadme(path) {
293
+ const description = document.getElementById("description");
294
+
295
+ try {
296
+ const response = await fetch(path);
297
+ if (!response.ok) throw new Error();
298
+
299
+ const markdown = await response.text();
300
+ description.classList.remove("loading");
301
+ description.innerHTML = marked.parse(markdown);
302
+
303
+ } catch {
304
+ showError("Failed to load README file.");
305
+ }
306
  }
307
 
308
+ function showError(message) {
309
+ const description = document.getElementById("description");
310
+ description.classList.remove("loading");
311
+ description.innerHTML = `<div class="error">${message}</div>`;
 
 
 
 
 
 
 
 
 
 
 
312
  }
313
  </script>
314
 
315
  </body>
316
+ </html>
ProjectViewr/data/Pro1.json CHANGED
@@ -4,5 +4,5 @@
4
  "tools": "Python, TensorFlow, OpenCV",
5
  "displayType": "video",
6
  "filePath": "../assets/Videos/indoor.mp4",
7
- "description": "<p>This project focuses on indoor positioning using WiFi fingerprinting, real-time tracking, and intelligent navigation algorithms.</p>"
8
  }
 
4
  "tools": "Python, TensorFlow, OpenCV",
5
  "displayType": "video",
6
  "filePath": "../assets/Videos/indoor.mp4",
7
+ "description": "./data/ReadMeFiles/pro1.readme "
8
  }
ProjectViewr/data/Pro2.json CHANGED
@@ -4,5 +4,5 @@
4
  "tools": "Python, TensorFlow, WiFi",
5
  "displayType": "video",
6
  "filePath": "../assets/Videos/FaceRec.3gp",
7
- "description": "### Face Recognition Project using FaceNet\n\nDeveloped a **Face Recognition system** based on the FaceNet paper, introducing a novel loss function:\n\n```\n∑2_i^N [MAX(|f(x^A) - f(x^P)| - 0.2*α) + MAX(-|f(x^A) - f(x^N)| + α), 0]\n```\n\nAchieved **10% higher accuracy** than the original paper while training on only **6,000 images** compared to **1,000,000 images** in the original paper. The optimized model generalizes well even with a small dataset, demonstrating practical applicability for **real-world face recognition systems**."
8
  }
 
4
  "tools": "Python, TensorFlow, WiFi",
5
  "displayType": "video",
6
  "filePath": "../assets/Videos/FaceRec.3gp",
7
+ "description": "./data/ReadMeFiles/pro2.readme"
8
  }
ProjectViewr/data/Pro3.json CHANGED
@@ -4,5 +4,5 @@
4
  "tools": "Python, TensorFlow, n8n",
5
  "displayType": "video",
6
  "filePath": "../assets/Videos/nano.mp4",
7
- "description": "<p>This project focuses on indoor positioning using WiFi fingerprinting, real-time tracking, and intelligent navigation algorithms.</p>"
8
  }
 
4
  "tools": "Python, TensorFlow, n8n",
5
  "displayType": "video",
6
  "filePath": "../assets/Videos/nano.mp4",
7
+ "description": "./data/ReadMeFiles/pro3.readme"
8
  }
ProjectViewr/data/Pro4.json CHANGED
@@ -4,5 +4,5 @@
4
  "tools": "Python, FastAPI, TensorFlow NextJS",
5
  "displayType": "video",
6
  "filePath": "../assets/Videos/React.mp4",
7
- "description": "<p>This project focuses on indoor positioning using WiFi fingerprinting, real-time tracking, and intelligent navigation algorithms.</p>"
8
  }
 
4
  "tools": "Python, FastAPI, TensorFlow NextJS",
5
  "displayType": "video",
6
  "filePath": "../assets/Videos/React.mp4",
7
+ "description": "./data/ReadMeFiles/pro4.readme"
8
  }
assets/css/style.css CHANGED
@@ -1,1880 +1,1880 @@
1
- /*-----------------------------------*\
2
- #style.css
3
- \*-----------------------------------*/
4
-
5
-
6
- /**
7
- * copyright 2022 @codewithsadee
8
- */
9
-
10
-
11
- /*-----------------------------------*\
12
- #CUSTOM PROPERTY
13
- \*-----------------------------------*/
14
-
15
- :root {
16
- /**
17
- * colors
18
- */
19
- /* gradient */
20
- --bg-gradient-onyx: linear-gradient( to bottom right, hsl(240, 1%, 25%) 3%, hsl(0, 0%, 19%) 97%);
21
- --bg-gradient-jet: linear-gradient( to bottom right, hsla(240, 1%, 18%, 0.251) 0%, hsla(240, 2%, 11%, 0) 100%), hsl(240, 2%, 13%);
22
- --bg-gradient-yellow-1: linear-gradient( to bottom right, hsl(45, 100%, 71%) 0%, hsla(36, 100%, 69%, 0) 50%);
23
- --bg-gradient-yellow-2: linear-gradient( 135deg, hsla(45, 100%, 71%, 0.251) 0%, hsla(35, 100%, 68%, 0) 59.86%), hsl(240, 2%, 13%);
24
- --border-gradient-onyx: linear-gradient( to bottom right, hsl(0, 0%, 25%) 0%, hsla(0, 0%, 25%, 0) 50%);
25
- --text-gradient-yellow: linear-gradient( to right, hsl(45, 100%, 72%), hsl(35, 100%, 68%));
26
- /* solid */
27
- --jet: hsl(0, 0%, 22%);
28
- --onyx: hsl(240, 1%, 17%);
29
- --eerie-black-1: hsl(240, 2%, 13%);
30
- --eerie-black-2: hsl(240, 2%, 12%);
31
- --smoky-black: hsl(0, 0%, 7%);
32
- --white-1: hsl(0, 0%, 100%);
33
- --white-2: hsl(0, 0%, 98%);
34
- --orange-yellow-crayola: hsl(45, 100%, 72%);
35
- --vegas-gold: hsl(45, 54%, 58%);
36
- --light-gray: hsl(0, 0%, 84%);
37
- --light-gray-70: hsla(0, 0%, 84%, 0.7);
38
- --bittersweet-shimmer: hsl(0, 43%, 51%);
39
- /**
40
- * typography
41
- */
42
- /* font-family */
43
- --ff-poppins: 'Poppins', sans-serif;
44
- /* font-size */
45
- --fs-1: 24px;
46
- --fs-2: 18px;
47
- --fs-3: 17px;
48
- --fs-4: 16px;
49
- --fs-5: 15px;
50
- --fs-6: 14px;
51
- --fs-7: 13px;
52
- --fs-8: 11px;
53
- /* font-weight */
54
- --fw-300: 300;
55
- --fw-400: 400;
56
- --fw-500: 500;
57
- --fw-600: 600;
58
- /**
59
- * shadow
60
- */
61
- --shadow-1: -4px 8px 24px hsla(0, 0%, 0%, 0.25);
62
- --shadow-2: 0 16px 30px hsla(0, 0%, 0%, 0.25);
63
- --shadow-3: 0 16px 40px hsla(0, 0%, 0%, 0.25);
64
- --shadow-4: 0 25px 50px hsla(0, 0%, 0%, 0.15);
65
- --shadow-5: 0 24px 80px hsla(0, 0%, 0%, 0.25);
66
- /**
67
- * transition
68
- */
69
- --transition-1: 0.25s ease;
70
- --transition-2: 0.5s ease-in-out;
71
- }
72
-
73
-
74
- /*-----------------------------------*\
75
- #RESET
76
- \*-----------------------------------*/
77
-
78
- *,
79
- *::before,
80
- *::after {
81
- margin: 0;
82
- padding: 0;
83
- box-sizing: border-box;
84
- }
85
-
86
- a {
87
- text-decoration: none;
88
- }
89
-
90
- li {
91
- list-style: none;
92
- }
93
-
94
- img,
95
- ion-icon,
96
- a,
97
- button,
98
- time,
99
- span {
100
- display: block;
101
- }
102
-
103
- button {
104
- font: inherit;
105
- background: none;
106
- border: none;
107
- text-align: left;
108
- cursor: pointer;
109
- }
110
-
111
- input,
112
- textarea {
113
- display: block;
114
- width: 100%;
115
- background: none;
116
- font: inherit;
117
- }
118
-
119
- ::selection {
120
- background: var(--orange-yellow-crayola);
121
- color: var(--smoky-black);
122
- }
123
-
124
- :focus {
125
- outline-color: var(--orange-yellow-crayola);
126
- }
127
-
128
- html {
129
- font-family: var(--ff-poppins);
130
- }
131
-
132
- body {
133
- background: var(--smoky-black);
134
- }
135
-
136
-
137
- /*-----------------------------------*\
138
- #REUSED STYLE
139
- \*-----------------------------------*/
140
-
141
- .sidebar,
142
- article {
143
- background: var(--eerie-black-2);
144
- border: 1px solid var(--jet);
145
- border-radius: 20px;
146
- padding: 15px;
147
- box-shadow: var(--shadow-1);
148
- z-index: 1;
149
- }
150
-
151
- .separator {
152
- width: 100%;
153
- height: 1px;
154
- background: var(--jet);
155
- margin: 16px 0;
156
- }
157
-
158
- .icon-box {
159
- position: relative;
160
- background: var(--border-gradient-onyx);
161
- width: 30px;
162
- height: 30px;
163
- border-radius: 8px;
164
- display: flex;
165
- justify-content: center;
166
- align-items: center;
167
- font-size: 16px;
168
- color: var(--orange-yellow-crayola);
169
- box-shadow: var(--shadow-1);
170
- z-index: 1;
171
- }
172
-
173
- .icon-box::before {
174
- content: "";
175
- position: absolute;
176
- inset: 1px;
177
- background: var(--eerie-black-1);
178
- border-radius: inherit;
179
- z-index: -1;
180
- }
181
-
182
- .icon-box ion-icon {
183
- --ionicon-stroke-width: 35px;
184
- }
185
-
186
- article {
187
- display: none;
188
- }
189
-
190
- article.active {
191
- display: block;
192
- animation: fade 0.5s ease backwards;
193
- }
194
-
195
- @keyframes fade {
196
- 0% {
197
- opacity: 0;
198
- }
199
- 100% {
200
- opacity: 1;
201
- }
202
- }
203
-
204
- .h2,
205
- .h3,
206
- .h4,
207
- .h5 {
208
- color: var(--white-2);
209
- text-transform: capitalize;
210
- }
211
-
212
- .h2 {
213
- font-size: var(--fs-1);
214
- }
215
-
216
- .h3 {
217
- font-size: var(--fs-2);
218
- }
219
-
220
- .h4 {
221
- font-size: var(--fs-4);
222
- }
223
-
224
- .h5 {
225
- font-size: var(--fs-7);
226
- font-weight: var(--fw-500);
227
- }
228
-
229
- .article-title {
230
- position: relative;
231
- padding-bottom: 7px;
232
- }
233
-
234
- .article-title::after {
235
- content: "";
236
- position: absolute;
237
- bottom: 0;
238
- left: 0;
239
- width: 30px;
240
- height: 3px;
241
- background: var(--text-gradient-yellow);
242
- border-radius: 3px;
243
- }
244
-
245
- .has-scrollbar::-webkit-scrollbar {
246
- width: 5px;
247
- /* for vertical scrollbar */
248
- height: 5px;
249
- /* for horizontal scrollbar */
250
- }
251
-
252
- .has-scrollbar::-webkit-scrollbar-track {
253
- background: var(--onyx);
254
- border-radius: 5px;
255
- }
256
-
257
- .has-scrollbar::-webkit-scrollbar-thumb {
258
- background: var(--orange-yellow-crayola);
259
- border-radius: 5px;
260
- }
261
-
262
- .has-scrollbar::-webkit-scrollbar-button {
263
- width: 20px;
264
- }
265
-
266
- .content-card {
267
- position: relative;
268
- background: var(--border-gradient-onyx);
269
- padding: 15px;
270
- padding-top: 45px;
271
- border-radius: 14px;
272
- box-shadow: var(--shadow-2);
273
- cursor: pointer;
274
- z-index: 1;
275
- }
276
-
277
- .content-card::before {
278
- content: "";
279
- position: absolute;
280
- inset: 1px;
281
- background: var(--bg-gradient-jet);
282
- border-radius: inherit;
283
- z-index: -1;
284
- }
285
-
286
-
287
- /*-----------------------------------*\
288
- #MAIN
289
- \*-----------------------------------*/
290
-
291
- main {
292
- margin: 15px 12px;
293
- margin-bottom: 75px;
294
- min-width: 259px;
295
- }
296
-
297
-
298
- /*-----------------------------------*\
299
- #SIDEBAR
300
- \*-----------------------------------*/
301
-
302
- .sidebar {
303
- margin-bottom: 15px;
304
- max-height: 112px;
305
- overflow: hidden;
306
- transition: var(--transition-2);
307
- }
308
-
309
- .sidebar.active {
310
- max-height: 405px;
311
- }
312
-
313
- .sidebar-info {
314
- position: relative;
315
- display: flex;
316
- justify-content: flex-start;
317
- align-items: center;
318
- gap: 15px;
319
- }
320
-
321
- .avatar-box {
322
- background: var(--bg-gradient-onyx);
323
- border-radius: 20px;
324
- }
325
-
326
- .info-content .name {
327
- color: var(--white-2);
328
- font-size: var(--fs-3);
329
- font-weight: var(--fw-500);
330
- letter-spacing: -0.25px;
331
- margin-bottom: 10px;
332
- }
333
-
334
- .info-content .title {
335
- color: var(--white-1);
336
- background: var(--onyx);
337
- font-size: var(--fs-8);
338
- font-weight: var(--fw-300);
339
- width: max-content;
340
- padding: 3px 12px;
341
- border-radius: 8px;
342
- }
343
-
344
- .info_more-btn {
345
- position: absolute;
346
- top: -15px;
347
- right: -15px;
348
- border-radius: 0 15px;
349
- font-size: 13px;
350
- color: var(--orange-yellow-crayola);
351
- background: var(--border-gradient-onyx);
352
- padding: 10px;
353
- box-shadow: var(--shadow-2);
354
- transition: var(--transition-1);
355
- z-index: 1;
356
- }
357
-
358
- .info_more-btn::before {
359
- content: "";
360
- position: absolute;
361
- inset: 1px;
362
- border-radius: inherit;
363
- background: var(--bg-gradient-jet);
364
- transition: var(--transition-1);
365
- z-index: -1;
366
- }
367
-
368
- .info_more-btn:hover,
369
- .info_more-btn:focus {
370
- background: var(--bg-gradient-yellow-1);
371
- }
372
-
373
- .info_more-btn:hover::before,
374
- .info_more-btn:focus::before {
375
- background: var(--bg-gradient-yellow-2);
376
- }
377
-
378
- .info_more-btn span {
379
- display: none;
380
- }
381
-
382
- .sidebar-info_more {
383
- opacity: 0;
384
- visibility: hidden;
385
- transition: var(--transition-2);
386
- }
387
-
388
- .sidebar.active .sidebar-info_more {
389
- opacity: 1;
390
- visibility: visible;
391
- }
392
-
393
- .contacts-list {
394
- display: grid;
395
- grid-template-columns: 1fr;
396
- gap: 16px;
397
- }
398
-
399
- .contact-item {
400
- min-width: 100%;
401
- display: flex;
402
- align-items: center;
403
- gap: 16px;
404
- }
405
-
406
- .contact-info {
407
- max-width: calc(100% - 46px);
408
- width: calc(100% - 46px);
409
- }
410
-
411
- .contact-title {
412
- color: var(--light-gray-70);
413
- font-size: var(--fs-8);
414
- text-transform: uppercase;
415
- margin-bottom: 2px;
416
- }
417
-
418
- .contact-info :is(.contact-link, time, address) {
419
- color: var(--white-2);
420
- font-size: var(--fs-7);
421
- }
422
-
423
- .contact-info address {
424
- font-style: normal;
425
- }
426
-
427
- .social-list {
428
- display: flex;
429
- justify-content: flex-start;
430
- align-items: center;
431
- gap: 15px;
432
- padding-bottom: 4px;
433
- padding-left: 7px;
434
- }
435
-
436
- .social-item .social-link {
437
- color: var(--light-gray-70);
438
- font-size: 18px;
439
- }
440
-
441
- .social-item .social-link:hover {
442
- color: var(--light-gray);
443
- }
444
-
445
-
446
- /*-----------------------------------*\
447
- #NAVBAR
448
- \*-----------------------------------*/
449
-
450
- .navbar {
451
- position: fixed;
452
- bottom: 0;
453
- left: 0;
454
- width: 100%;
455
- background: hsla(240, 1%, 17%, 0.75);
456
- backdrop-filter: blur(10px);
457
- border: 1px solid var(--jet);
458
- border-radius: 12px 12px 0 0;
459
- box-shadow: var(--shadow-2);
460
- z-index: 5;
461
- }
462
-
463
- .navbar-list {
464
- display: flex;
465
- flex-wrap: wrap;
466
- justify-content: center;
467
- align-items: center;
468
- padding: 0 10px;
469
- }
470
-
471
- .navbar-link {
472
- color: var(--light-gray);
473
- font-size: var(--fs-8);
474
- padding: 20px 7px;
475
- transition: color var(--transition-1);
476
- }
477
-
478
- .navbar-link:hover,
479
- .navbar-link:focus {
480
- color: var(--light-gray-70);
481
- }
482
-
483
- .navbar-link.active {
484
- color: var(--orange-yellow-crayola);
485
- }
486
-
487
-
488
- /*-----------------------------------*\
489
- #ABOUT
490
- \*-----------------------------------*/
491
-
492
- .about .article-title {
493
- margin-bottom: 15px;
494
- }
495
-
496
- .about-text {
497
- color: var(--light-gray);
498
- font-size: var(--fs-6);
499
- font-weight: var(--fw-300);
500
- line-height: 1.6;
501
- }
502
-
503
- .about-text p {
504
- margin-bottom: 15px;
505
- }
506
-
507
-
508
- /**
509
- * #service
510
- */
511
-
512
- .service {
513
- margin-bottom: 35px;
514
- }
515
-
516
- .service-title {
517
- margin-bottom: 20px;
518
- }
519
-
520
- .service-list {
521
- display: grid;
522
- grid-template-columns: 1fr;
523
- gap: 20px;
524
- }
525
-
526
- .service-item {
527
- position: relative;
528
- background: var(--border-gradient-onyx);
529
- padding: 20px;
530
- border-radius: 14px;
531
- box-shadow: var(--shadow-2);
532
- z-index: 1;
533
- }
534
-
535
- .service-item::before {
536
- content: "";
537
- position: absolute;
538
- inset: 1px;
539
- background: var(--bg-gradient-jet);
540
- border-radius: inherit;
541
- z-index: -1;
542
- }
543
-
544
- .service-icon-box {
545
- margin-bottom: 10px;
546
- }
547
-
548
- .service-icon-box img {
549
- margin: auto;
550
- }
551
-
552
- .service-content-box {
553
- text-align: center;
554
- }
555
-
556
- .service-item-title {
557
- margin-bottom: 7px;
558
- }
559
-
560
- .service-item-text {
561
- color: var(--light-gray);
562
- font-size: var(--fs-6);
563
- font-weight: var(--fw-3);
564
- line-height: 1.6;
565
- }
566
-
567
-
568
- /**
569
- * #testimonials
570
- */
571
-
572
- .testimonials {
573
- margin-bottom: 30px;
574
- }
575
-
576
- .testimonials-title {
577
- margin-bottom: 20px;
578
- }
579
-
580
- .testimonials-list {
581
- display: flex;
582
- justify-content: flex-start;
583
- align-items: flex-start;
584
- gap: 15px;
585
- margin: 0 -15px;
586
- padding: 25px 15px;
587
- padding-bottom: 35px;
588
- overflow-x: auto;
589
- scroll-behavior: smooth;
590
- overscroll-behavior-inline: contain;
591
- scroll-snap-type: inline mandatory;
592
- }
593
-
594
- .testimonials-item {
595
- min-width: 100%;
596
- scroll-snap-align: center;
597
- }
598
-
599
- .testimonials-avatar-box {
600
- position: absolute;
601
- top: 0;
602
- left: 0;
603
- transform: translate(15px, -25px);
604
- background: var(--bg-gradient-onyx);
605
- border-radius: 14px;
606
- box-shadow: var(--shadow-1);
607
- }
608
-
609
- .testimonials-item-title {
610
- margin-bottom: 7px;
611
- }
612
-
613
- .testimonials-text {
614
- color: var(--light-gray);
615
- font-size: var(--fs-6);
616
- font-weight: var(--fw-300);
617
- line-height: 1.6;
618
- display: -webkit-box;
619
- line-clamp: 4;
620
- -webkit-line-clamp: 4;
621
- -webkit-box-orient: vertical;
622
- overflow: hidden;
623
- }
624
-
625
-
626
- /**
627
- * #testimonials-modal
628
- */
629
-
630
- .modal-container {
631
- position: fixed;
632
- top: 0;
633
- left: 0;
634
- width: 100%;
635
- height: 100%;
636
- display: flex;
637
- justify-content: center;
638
- align-items: center;
639
- overflow-y: auto;
640
- overscroll-behavior: contain;
641
- z-index: 20;
642
- pointer-events: none;
643
- visibility: hidden;
644
- }
645
-
646
- .modal-container::-webkit-scrollbar {
647
- display: none;
648
- }
649
-
650
- .modal-container.active {
651
- pointer-events: all;
652
- visibility: visible;
653
- }
654
-
655
- .overlay {
656
- position: fixed;
657
- top: 0;
658
- left: 0;
659
- width: 100%;
660
- height: 100vh;
661
- background: hsl(0, 0%, 5%);
662
- opacity: 0;
663
- visibility: hidden;
664
- pointer-events: none;
665
- z-index: 1;
666
- transition: var(--transition-1);
667
- }
668
-
669
- .overlay.active {
670
- opacity: 0.8;
671
- visibility: visible;
672
- pointer-events: all;
673
- }
674
-
675
- .testimonials-modal {
676
- background: var(--eerie-black-2);
677
- position: relative;
678
- padding: 15px;
679
- margin: 15px 12px;
680
- border: 1px solid var(--jet);
681
- border-radius: 14px;
682
- box-shadow: var(--shadow-5);
683
- transform: scale(1.2);
684
- opacity: 0;
685
- transition: var(--transition-1);
686
- z-index: 2;
687
- }
688
-
689
- .modal-container.active .testimonials-modal {
690
- transform: scale(1);
691
- opacity: 1;
692
- }
693
-
694
- .modal-close-btn {
695
- position: absolute;
696
- top: 15px;
697
- right: 15px;
698
- background: var(--onyx);
699
- border-radius: 8px;
700
- width: 32px;
701
- height: 32px;
702
- display: flex;
703
- justify-content: center;
704
- align-items: center;
705
- color: var(--white-2);
706
- font-size: 18px;
707
- opacity: 0.7;
708
- }
709
-
710
- .modal-close-btn:hover,
711
- .modal-close-btn:focus {
712
- opacity: 1;
713
- }
714
-
715
- .modal-close-btn ion-icon {
716
- --ionicon-stroke-width: 50px;
717
- }
718
-
719
- .modal-avatar-box {
720
- background: var(--bg-gradient-onyx);
721
- width: max-content;
722
- border-radius: 14px;
723
- margin-bottom: 15px;
724
- box-shadow: var(--shadow-2);
725
- }
726
-
727
- .modal-img-wrapper>img {
728
- display: none;
729
- }
730
-
731
- .modal-title {
732
- margin-bottom: 4px;
733
- }
734
-
735
- .modal-content time {
736
- font-size: var(--fs-6);
737
- color: var(--light-gray-70);
738
- font-weight: var(--fw-300);
739
- margin-bottom: 10px;
740
- }
741
-
742
- .modal-content p {
743
- color: var(--light-gray);
744
- font-size: var(--fs-6);
745
- font-weight: var(--fw-300);
746
- line-height: 1.6;
747
- }
748
-
749
-
750
- /**
751
- * #clients
752
- */
753
-
754
- .clients {
755
- margin-bottom: 15px;
756
- }
757
-
758
- .clients-list {
759
- display: flex;
760
- justify-content: flex-start;
761
- align-items: flex-start;
762
- gap: 15px;
763
- margin: 0 -15px;
764
- padding: 25px;
765
- padding-bottom: 25px;
766
- overflow-x: auto;
767
- scroll-behavior: smooth;
768
- overscroll-behavior-inline: contain;
769
- scroll-snap-type: inline mandatory;
770
- scroll-padding-inline: 25px;
771
- }
772
-
773
- .clients-item {
774
- min-width: 50%;
775
- scroll-snap-align: start;
776
- }
777
-
778
- .clients-item img {
779
- width: 100%;
780
- filter: grayscale(1);
781
- transition: var(--transition-1);
782
- }
783
-
784
- .clients-item img:hover {
785
- filter: grayscale(0);
786
- }
787
-
788
-
789
- /*-----------------------------------*\
790
- #RESUME
791
- \*-----------------------------------*/
792
-
793
- .article-title {
794
- margin-bottom: 30px;
795
- }
796
-
797
-
798
- /**
799
- * education and experience
800
- */
801
-
802
- .timeline {
803
- margin-bottom: 30px;
804
- }
805
-
806
- .timeline .title-wrapper {
807
- display: flex;
808
- align-items: center;
809
- gap: 15px;
810
- margin-bottom: 25px;
811
- }
812
-
813
- .timeline-list {
814
- font-size: var(--fs-6);
815
- margin-left: 45px;
816
- }
817
-
818
- .timeline-item {
819
- position: relative;
820
- }
821
-
822
- .timeline-item:not(:last-child) {
823
- margin-bottom: 20px;
824
- }
825
-
826
- .timeline-item-title {
827
- font-size: var(--fs-6);
828
- line-height: 1.3;
829
- margin-bottom: 7px;
830
- }
831
-
832
- .timeline-list span {
833
- color: var(--vegas-gold);
834
- font-weight: var(--fw-400);
835
- line-height: 1.6;
836
- }
837
-
838
- .timeline-item:not(:last-child)::before {
839
- content: "";
840
- position: absolute;
841
- top: -25px;
842
- left: -30px;
843
- width: 1px;
844
- height: calc(100% + 50px);
845
- background: var(--jet);
846
- }
847
-
848
- .timeline-item::after {
849
- content: "";
850
- position: absolute;
851
- top: 5px;
852
- left: -33px;
853
- height: 6px;
854
- width: 6px;
855
- background: var(--text-gradient-yellow);
856
- border-radius: 50%;
857
- box-shadow: 0 0 0 4px var(--jet);
858
- }
859
-
860
- .timeline-text {
861
- color: var(--light-gray);
862
- font-weight: var(--fw-300);
863
- line-height: 1.6;
864
- }
865
-
866
-
867
- /**
868
- * skills
869
- */
870
-
871
- .skills-title {
872
- margin-bottom: 20px;
873
- }
874
-
875
- .skills-list {
876
- padding: 20px;
877
- }
878
-
879
- .skills-item:not(:last-child) {
880
- margin-bottom: 15px;
881
- }
882
-
883
- .skill .title-wrapper {
884
- display: flex;
885
- align-items: center;
886
- gap: 5px;
887
- margin-bottom: 8px;
888
- }
889
-
890
- .skill .title-wrapper data {
891
- color: var(--light-gray);
892
- font-size: var(--fs-7);
893
- font-weight: var(--fw-300);
894
- }
895
-
896
- .skill-progress-bg {
897
- background: var(--jet);
898
- width: 100%;
899
- height: 8px;
900
- border-radius: 10px;
901
- }
902
-
903
- .skill-progress-fill {
904
- background: var(--text-gradient-yellow);
905
- height: 100%;
906
- border-radius: inherit;
907
- }
908
-
909
-
910
- /*-----------------------------------*\
911
- #PORTFOLIO
912
- \*-----------------------------------*/
913
-
914
- .filter-list {
915
- display: none;
916
- }
917
-
918
- .filter-select-box {
919
- position: relative;
920
- margin-bottom: 25px;
921
- }
922
-
923
- .filter-select {
924
- background: var(--eerie-black-2);
925
- color: var(--light-gray);
926
- display: flex;
927
- justify-content: space-between;
928
- align-items: center;
929
- width: 100%;
930
- padding: 12px 16px;
931
- border: 1px solid var(--jet);
932
- border-radius: 14px;
933
- font-size: var(--fs-6);
934
- font-weight: var(--fw-300);
935
- }
936
-
937
- .filter-select.active .select-icon {
938
- transform: rotate(0.5turn);
939
- }
940
-
941
- .select-list {
942
- background: var(--eerie-black-2);
943
- position: absolute;
944
- top: calc(100% + 6px);
945
- width: 100%;
946
- padding: 6px;
947
- border: 1px solid var(--jet);
948
- border-radius: 14px;
949
- z-index: 2;
950
- opacity: 0;
951
- visibility: hidden;
952
- pointer-events: none;
953
- transition: 0.15s ease-in-out;
954
- }
955
-
956
- .filter-select.active+.select-list {
957
- opacity: 1;
958
- visibility: visible;
959
- pointer-events: all;
960
- }
961
-
962
- .select-item button {
963
- background: var(--eerie-black-2);
964
- color: var(--light-gray);
965
- font-size: var(--fs-6);
966
- font-weight: var(--fw-300);
967
- text-transform: capitalize;
968
- width: 100%;
969
- padding: 8px 10px;
970
- border-radius: 8px;
971
- }
972
-
973
- .select-item button:hover {
974
- --eerie-black-2: hsl(240, 2%, 20%);
975
- }
976
-
977
- .project-list {
978
- display: grid;
979
- grid-template-columns: 1fr;
980
- gap: 30px;
981
- margin-bottom: 10px;
982
- }
983
-
984
- .project-item {
985
- display: none;
986
- }
987
-
988
- .project-item.active {
989
- display: block;
990
- animation: scaleUp 0.25s ease forwards;
991
- }
992
-
993
- @keyframes scaleUp {
994
- 0% {
995
- transform: scale(0.5);
996
- }
997
- 100% {
998
- transform: scale(1);
999
- }
1000
- }
1001
-
1002
- .project-item>a {
1003
- width: 100%;
1004
- }
1005
-
1006
- .project-img {
1007
- position: relative;
1008
- width: 100%;
1009
- height: 200px;
1010
- border-radius: 16px;
1011
- overflow: hidden;
1012
- margin-bottom: 15px;
1013
- }
1014
-
1015
- .project-img::before {
1016
- content: "";
1017
- position: absolute;
1018
- top: 0;
1019
- left: 0;
1020
- width: 100%;
1021
- height: 100%;
1022
- background: transparent;
1023
- z-index: 1;
1024
- transition: var(--transition-1);
1025
- }
1026
-
1027
- .project-item>a:hover .project-img::before {
1028
- background: hsla(0, 0%, 0%, 0.5);
1029
- }
1030
-
1031
- .project-item-icon-box {
1032
- --scale: 0.8;
1033
- background: var(--jet);
1034
- color: var(--orange-yellow-crayola);
1035
- position: absolute;
1036
- top: 50%;
1037
- left: 50%;
1038
- transform: translate(-50%, -50%) scale(var(--scale));
1039
- font-size: 20px;
1040
- padding: 18px;
1041
- border-radius: 12px;
1042
- opacity: 0;
1043
- z-index: 1;
1044
- transition: var(--transition-1);
1045
- }
1046
-
1047
- .project-item>a:hover .project-item-icon-box {
1048
- --scale: 1;
1049
- opacity: 1;
1050
- }
1051
-
1052
- .project-item-icon-box ion-icon {
1053
- --ionicon-stroke-width: 50px;
1054
- }
1055
-
1056
- .project-img video {
1057
- width: 100%;
1058
- height: 100%;
1059
- object-fit: cover;
1060
- transition: var(--transition-1);
1061
- }
1062
-
1063
- .project-img img {
1064
- width: 105%;
1065
- min-height: 200px;
1066
- transition: var(--transition-1);
1067
- margin: 9px;
1068
- }
1069
-
1070
- .project-item>a:hover img {
1071
- transform: scale(1.1);
1072
- }
1073
-
1074
- .project-title,
1075
- .project-category {
1076
- margin-left: 10px;
1077
- }
1078
-
1079
- .project-title {
1080
- color: var(--white-2);
1081
- font-size: var(--fs-5);
1082
- font-weight: var(--fw-400);
1083
- text-transform: capitalize;
1084
- line-height: 1.3;
1085
- }
1086
-
1087
- .project-category {
1088
- color: var(--light-gray-70);
1089
- font-size: var(--fs-6);
1090
- font-weight: var(--fw-300);
1091
- }
1092
-
1093
-
1094
- /*-----------------------------------*\
1095
- #BLOG
1096
- \*-----------------------------------*/
1097
-
1098
- .blog-posts {
1099
- margin-bottom: 10px;
1100
- }
1101
-
1102
- .blog-posts-list {
1103
- display: grid;
1104
- grid-template-columns: 1fr;
1105
- gap: 20px;
1106
- }
1107
-
1108
- .blog-post-item>a {
1109
- position: relative;
1110
- background: var(--border-gradient-onyx);
1111
- height: 100%;
1112
- box-shadow: var(--shadow-4);
1113
- border-radius: 16px;
1114
- z-index: 1;
1115
- }
1116
-
1117
- .blog-post-item>a::before {
1118
- content: "";
1119
- position: absolute;
1120
- inset: 1px;
1121
- border-radius: inherit;
1122
- background: var(--eerie-black-1);
1123
- z-index: -1;
1124
- }
1125
-
1126
- .blog-banner-box {
1127
- width: 100%;
1128
- height: 200px;
1129
- border-radius: 12px;
1130
- overflow: hidden;
1131
- }
1132
-
1133
- .blog-banner-box img {
1134
- width: 100%;
1135
- height: 100%;
1136
- object-fit: cover;
1137
- transition: var(--transition-1);
1138
- }
1139
-
1140
- .blog-post-item>a:hover .blog-banner-box img {
1141
- transform: scale(1.1);
1142
- }
1143
-
1144
- .blog-content {
1145
- padding: 15px;
1146
- }
1147
-
1148
- .blog-meta {
1149
- display: flex;
1150
- justify-content: flex-start;
1151
- align-items: center;
1152
- gap: 7px;
1153
- margin-bottom: 10px;
1154
- }
1155
-
1156
- .blog-meta :is(.blog-category, time) {
1157
- color: var(--light-gray-70);
1158
- font-size: var(--fs-6);
1159
- font-weight: var(--fw-300);
1160
- }
1161
-
1162
- .blog-meta .dot {
1163
- background: var(--light-gray-70);
1164
- width: 4px;
1165
- height: 4px;
1166
- border-radius: 4px;
1167
- }
1168
-
1169
- .blog-item-title {
1170
- margin-bottom: 10px;
1171
- line-height: 1.3;
1172
- transition: var(--transition-1);
1173
- }
1174
-
1175
- .blog-post-item>a:hover .blog-item-title {
1176
- color: var(--orange-yellow-crayola);
1177
- }
1178
-
1179
- .blog-text {
1180
- color: var(--light-gray);
1181
- font-size: var(--fs-6);
1182
- font-weight: var(--fw-300);
1183
- line-height: 1.6;
1184
- }
1185
-
1186
-
1187
- /*-----------------------------------*\
1188
- #CONTACT
1189
- \*-----------------------------------*/
1190
-
1191
- .mapbox {
1192
- position: relative;
1193
- height: 250px;
1194
- width: 100%;
1195
- border-radius: 16px;
1196
- margin-bottom: 30px;
1197
- border: 1px solid var(--jet);
1198
- overflow: hidden;
1199
- }
1200
-
1201
- .mapbox figure {
1202
- height: 100%;
1203
- }
1204
-
1205
- .mapbox iframe {
1206
- width: 100%;
1207
- height: 100%;
1208
- border: none;
1209
- filter: grayscale(1) invert(1);
1210
- }
1211
-
1212
- .contact-form {
1213
- margin-bottom: 10px;
1214
- }
1215
-
1216
- .form-title {
1217
- margin-bottom: 20px;
1218
- }
1219
-
1220
- .input-wrapper {
1221
- display: grid;
1222
- grid-template-columns: 1fr;
1223
- gap: 25px;
1224
- margin-bottom: 25px;
1225
- }
1226
-
1227
- .form-input {
1228
- color: var(--white-2);
1229
- font-size: var(--fs-6);
1230
- font-weight: var(--fw-400);
1231
- padding: 13px 20px;
1232
- border: 1px solid var(--jet);
1233
- border-radius: 14px;
1234
- outline: none;
1235
- }
1236
-
1237
- .form-input::placeholder {
1238
- font-weight: var(--fw-500);
1239
- }
1240
-
1241
- .form-input:focus {
1242
- border-color: var(--orange-yellow-crayola);
1243
- }
1244
-
1245
- textarea.form-input {
1246
- min-height: 100px;
1247
- height: 120px;
1248
- max-height: 200px;
1249
- resize: vertical;
1250
- margin-bottom: 25px;
1251
- }
1252
-
1253
- textarea.form-input::-webkit-resizer {
1254
- display: none;
1255
- }
1256
-
1257
- .form-input:focus:invalid {
1258
- border-color: var(--bittersweet-shimmer);
1259
- }
1260
-
1261
- .form-btn {
1262
- position: relative;
1263
- width: 100%;
1264
- background: var(--border-gradient-onyx);
1265
- color: var(--orange-yellow-crayola);
1266
- display: flex;
1267
- justify-content: center;
1268
- align-items: center;
1269
- gap: 10px;
1270
- padding: 13px 20px;
1271
- border-radius: 14px;
1272
- font-size: var(--fs-6);
1273
- text-transform: capitalize;
1274
- box-shadow: var(--shadow-3);
1275
- z-index: 1;
1276
- transition: var(--transition-1);
1277
- }
1278
-
1279
- .form-btn::before {
1280
- content: "";
1281
- position: absolute;
1282
- inset: 1px;
1283
- background: var(--bg-gradient-jet);
1284
- border-radius: inherit;
1285
- z-index: -1;
1286
- transition: var(--transition-1);
1287
- }
1288
-
1289
- .form-btn ion-icon {
1290
- font-size: 16px;
1291
- }
1292
-
1293
- .form-btn:hover {
1294
- background: var(--bg-gradient-yellow-1);
1295
- }
1296
-
1297
- .form-btn:hover::before {
1298
- background: var(--bg-gradient-yellow-2);
1299
- }
1300
-
1301
- .form-btn:disabled {
1302
- opacity: 0.7;
1303
- cursor: not-allowed;
1304
- }
1305
-
1306
- .form-btn:disabled:hover {
1307
- background: var(--border-gradient-onyx);
1308
- }
1309
-
1310
- .form-btn:disabled:hover::before {
1311
- background: var(--bg-gradient-jet);
1312
- }
1313
-
1314
-
1315
- /*-----------------------------------*\
1316
- #RESPONSIVE
1317
- \*-----------------------------------*/
1318
-
1319
-
1320
- /**
1321
- * responsive larger than 450px screen
1322
- */
1323
-
1324
- @media (min-width: 450px) {
1325
- /**
1326
- * client
1327
- */
1328
- .clients-item {
1329
- min-width: calc(33.33% - 10px);
1330
- }
1331
- /**
1332
- * #PORTFOLIO, BLOG
1333
- */
1334
- .project-img,
1335
- .blog-banner-box {
1336
- height: auto;
1337
- }
1338
- }
1339
-
1340
-
1341
- /**
1342
- * responsive larger than 580px screen
1343
- */
1344
-
1345
- @media (min-width: 580px) {
1346
- /**
1347
- * CUSTOM PROPERTY
1348
- */
1349
- :root {
1350
- /**
1351
- * typography
1352
- */
1353
- --fs-1: 32px;
1354
- --fs-2: 24px;
1355
- --fs-3: 26px;
1356
- --fs-4: 18px;
1357
- --fs-6: 15px;
1358
- --fs-7: 15px;
1359
- --fs-8: 12px;
1360
- }
1361
- /**
1362
- * #REUSED STYLE
1363
- */
1364
- .sidebar,
1365
- article {
1366
- width: 520px;
1367
- margin-inline: auto;
1368
- padding: 30px;
1369
- }
1370
- .article-title {
1371
- font-weight: var(--fw-600);
1372
- padding-bottom: 15px;
1373
- }
1374
- .article-title::after {
1375
- width: 40px;
1376
- height: 5px;
1377
- }
1378
- .icon-box {
1379
- width: 48px;
1380
- height: 48px;
1381
- border-radius: 12px;
1382
- font-size: 18px;
1383
- }
1384
- /**
1385
- * #MAIN
1386
- */
1387
- main {
1388
- margin-top: 60px;
1389
- margin-bottom: 100px;
1390
- }
1391
- /**
1392
- * #SIDEBAR
1393
- */
1394
- .sidebar {
1395
- max-height: 180px;
1396
- margin-bottom: 30px;
1397
- }
1398
- .sidebar.active {
1399
- max-height: 584px;
1400
- }
1401
- .sidebar-info {
1402
- gap: 25px;
1403
- }
1404
- .avatar-box {
1405
- border-radius: 30px;
1406
- }
1407
- .avatar-box img {
1408
- width: 120px;
1409
- }
1410
- .info-content .name {
1411
- margin-bottom: 15px;
1412
- }
1413
- .info-content .title {
1414
- padding: 5px 18px;
1415
- }
1416
- .info_more-btn {
1417
- top: -30px;
1418
- right: -30px;
1419
- padding: 10px 15px;
1420
- }
1421
- .info_more-btn span {
1422
- display: block;
1423
- font-size: var(--fs-8);
1424
- }
1425
- .info_more-btn ion-icon {
1426
- display: none;
1427
- }
1428
- .separator {
1429
- margin: 32px 0;
1430
- }
1431
- .contacts-list {
1432
- gap: 20px;
1433
- }
1434
- .contact-info {
1435
- max-width: calc(100% - 64px);
1436
- width: calc(100% - 64px);
1437
- }
1438
- /**
1439
- * #NAVBAR
1440
- */
1441
- .navbar {
1442
- border-radius: 20px 20px 0 0;
1443
- }
1444
- .navbar-list {
1445
- gap: 20px;
1446
- }
1447
- .navbar-link {
1448
- --fs-8: 14px;
1449
- }
1450
- /**
1451
- * #ABOUT
1452
- */
1453
- .about .article-title {
1454
- margin-bottom: 20px;
1455
- }
1456
- .about-text {
1457
- margin-bottom: 40px;
1458
- }
1459
- /* service */
1460
- .service-item {
1461
- display: flex;
1462
- justify-content: flex-start;
1463
- align-items: flex-start;
1464
- gap: 18px;
1465
- padding: 30px;
1466
- }
1467
- .service-icon-box {
1468
- margin-bottom: 0;
1469
- margin-top: 5px;
1470
- }
1471
- .service-content-box {
1472
- text-align: left;
1473
- }
1474
- /* testimonials */
1475
- .testimonials-title {
1476
- margin-bottom: 25px;
1477
- }
1478
- .testimonials-list {
1479
- gap: 30px;
1480
- margin: 0 -30px;
1481
- padding: 30px;
1482
- padding-bottom: 35px;
1483
- }
1484
- .content-card {
1485
- padding: 30px;
1486
- padding-top: 25px;
1487
- }
1488
- .testimonials-avatar-box {
1489
- transform: translate(30px, -30px);
1490
- border-radius: 20px;
1491
- }
1492
- .testimonials-avatar-box img {
1493
- width: 80px;
1494
- }
1495
- .testimonials-item-title {
1496
- margin-bottom: 10px;
1497
- margin-left: 95px;
1498
- }
1499
- .testimonials-text {
1500
- line-clamp: 2;
1501
- -webkit-line-clamp: 2;
1502
- }
1503
- /* testimonials modal */
1504
- .modal-container {
1505
- padding: 20px;
1506
- }
1507
- .testimonials-modal {
1508
- display: flex;
1509
- justify-content: flex-start;
1510
- align-items: stretch;
1511
- gap: 25px;
1512
- padding: 30px;
1513
- border-radius: 20px;
1514
- }
1515
- .modal-img-wrapper {
1516
- display: flex;
1517
- flex-direction: column;
1518
- align-items: center;
1519
- }
1520
- .modal-avatar-box {
1521
- border-radius: 18px;
1522
- margin-bottom: 0;
1523
- }
1524
- .modal-avatar-box img {
1525
- width: 65px;
1526
- }
1527
- .modal-img-wrapper>img {
1528
- display: block;
1529
- flex-grow: 1;
1530
- width: 35px;
1531
- }
1532
- /* clients */
1533
- .clients-list {
1534
- gap: 50px;
1535
- margin: 0 -30px;
1536
- padding: 45px;
1537
- scroll-padding-inline: 45px;
1538
- }
1539
- .clients-item {
1540
- min-width: calc(33.33% - 35px);
1541
- }
1542
- /**
1543
- * #RESUME
1544
- */
1545
- .timeline-list {
1546
- margin-left: 65px;
1547
- }
1548
- .timeline-item:not(:last-child)::before {
1549
- left: -40px;
1550
- }
1551
- .timeline-item::after {
1552
- height: 8px;
1553
- width: 8px;
1554
- left: -43px;
1555
- }
1556
- .skills-item:not(:last-child) {
1557
- margin-bottom: 25px;
1558
- }
1559
- /**
1560
- * #PORTFOLIO, BLOG
1561
- */
1562
- .project-img,
1563
- .blog-banner-box {
1564
- border-radius: 16px;
1565
- }
1566
- .blog-posts-list {
1567
- gap: 30px;
1568
- }
1569
- .blog-content {
1570
- padding: 25px;
1571
- }
1572
- /**
1573
- * #CONTACT
1574
- */
1575
- .mapbox {
1576
- height: 380px;
1577
- border-radius: 18px;
1578
- }
1579
- .input-wrapper {
1580
- gap: 30px;
1581
- margin-bottom: 30px;
1582
- }
1583
- .form-input {
1584
- padding: 15px 20px;
1585
- }
1586
- textarea.form-input {
1587
- margin-bottom: 30px;
1588
- }
1589
- .form-btn {
1590
- --fs-6: 16px;
1591
- padding: 16px 20px;
1592
- }
1593
- .form-btn ion-icon {
1594
- font-size: 18px;
1595
- }
1596
- }
1597
-
1598
-
1599
- /**
1600
- * responsive larger than 768px screen
1601
- */
1602
-
1603
- @media (min-width: 768px) {
1604
- /**
1605
- * REUSED STYLE
1606
- */
1607
- .sidebar,
1608
- article {
1609
- width: 700px;
1610
- }
1611
- .has-scrollbar::-webkit-scrollbar-button {
1612
- width: 100px;
1613
- }
1614
- /**
1615
- * SIDEBAR
1616
- */
1617
- .contacts-list {
1618
- grid-template-columns: 1fr 1fr;
1619
- gap: 30px 15px;
1620
- }
1621
- /**
1622
- * NAVBAR
1623
- */
1624
- .navbar-link {
1625
- --fs-8: 15px;
1626
- }
1627
- /**
1628
- * ABOUT
1629
- */
1630
- /* testimonials modal */
1631
- .testimonials-modal {
1632
- gap: 35px;
1633
- max-width: 680px;
1634
- }
1635
- .modal-avatar-box img {
1636
- width: 80px;
1637
- }
1638
- /**
1639
- * PORTFOLIO
1640
- */
1641
- .article-title {
1642
- padding-bottom: 20px;
1643
- }
1644
- .filter-select-box {
1645
- display: none;
1646
- }
1647
- .filter-list {
1648
- display: flex;
1649
- justify-content: flex-start;
1650
- align-items: center;
1651
- gap: 25px;
1652
- padding-left: 5px;
1653
- margin-bottom: 30px;
1654
- }
1655
- .filter-item button {
1656
- color: var(--light-gray);
1657
- font-size: var(--fs-5);
1658
- transition: var(--transition-1);
1659
- }
1660
- .filter-item button:hover {
1661
- color: var(--light-gray-70);
1662
- }
1663
- .filter-item button.active {
1664
- color: var(--orange-yellow-crayola);
1665
- }
1666
- /* portfolio and blog grid */
1667
- .project-list,
1668
- .blog-posts-list {
1669
- grid-template-columns: 1fr 1fr;
1670
- }
1671
- /**
1672
- * CONTACT
1673
- */
1674
- .input-wrapper {
1675
- grid-template-columns: 1fr 1fr;
1676
- }
1677
- .form-btn {
1678
- width: max-content;
1679
- margin-left: auto;
1680
- }
1681
- }
1682
-
1683
-
1684
- /**
1685
- * responsive larger than 1024px screen
1686
- */
1687
-
1688
- @media (min-width: 1024px) {
1689
- /**
1690
- * CUSTOM PROPERTY
1691
- */
1692
- :root {
1693
- /**
1694
- * shadow
1695
- */
1696
- --shadow-1: -4px 8px 24px hsla(0, 0%, 0%, 0.125);
1697
- --shadow-2: 0 16px 30px hsla(0, 0%, 0%, 0.125);
1698
- --shadow-3: 0 16px 40px hsla(0, 0%, 0%, 0.125);
1699
- }
1700
- /**
1701
- * REUSED STYLE
1702
- */
1703
- .sidebar,
1704
- article {
1705
- width: 950px;
1706
- box-shadow: var(--shadow-5);
1707
- }
1708
- /**
1709
- * MAIN
1710
- */
1711
- main {
1712
- margin-bottom: 60px;
1713
- }
1714
- .main-content {
1715
- position: relative;
1716
- width: max-content;
1717
- margin: auto;
1718
- }
1719
- /**
1720
- * NAVBAR
1721
- */
1722
- .navbar {
1723
- position: absolute;
1724
- bottom: auto;
1725
- top: 0;
1726
- left: auto;
1727
- right: 0;
1728
- width: max-content;
1729
- border-radius: 0 20px;
1730
- padding: 0 20px;
1731
- box-shadow: none;
1732
- }
1733
- .navbar-list {
1734
- gap: 30px;
1735
- padding: 0 20px;
1736
- }
1737
- .navbar-link {
1738
- font-weight: var(--fw-500);
1739
- }
1740
- /**
1741
- * ABOUT
1742
- */
1743
- /* service */
1744
- .service-list {
1745
- grid-template-columns: 1fr 1fr;
1746
- gap: 20px 25px;
1747
- }
1748
- /* testimonials */
1749
- .testimonials-item {
1750
- min-width: calc(50% - 15px);
1751
- }
1752
- /* clients */
1753
- .clients-item {
1754
- min-width: calc(25% - 38px);
1755
- }
1756
- /**
1757
- * PORTFOLIO
1758
- */
1759
- .project-list {
1760
- grid-template-columns: repeat(3, 1fr);
1761
- }
1762
- /**
1763
- * BLOG
1764
- */
1765
- .blog-banner-box {
1766
- height: 230px;
1767
- }
1768
- }
1769
-
1770
-
1771
- /**
1772
- * responsive larger than 1250px screen
1773
- */
1774
-
1775
- @media (min-width: 1250px) {
1776
- /**
1777
- * RESET
1778
- */
1779
- body::-webkit-scrollbar {
1780
- width: 20px;
1781
- }
1782
- body::-webkit-scrollbar-track {
1783
- background: var(--smoky-black);
1784
- }
1785
- body::-webkit-scrollbar-thumb {
1786
- border: 5px solid var(--smoky-black);
1787
- background: hsla(0, 0%, 100%, 0.1);
1788
- border-radius: 20px;
1789
- box-shadow: inset 1px 1px 0 hsla(0, 0%, 100%, 0.11), inset -1px -1px 0 hsla(0, 0%, 100%, 0.11);
1790
- }
1791
- body::-webkit-scrollbar-thumb:hover {
1792
- background: hsla(0, 0%, 100%, 0.15);
1793
- }
1794
- body::-webkit-scrollbar-button {
1795
- height: 60px;
1796
- }
1797
- /**
1798
- * REUSED STYLE
1799
- */
1800
- .sidebar,
1801
- article {
1802
- width: auto;
1803
- }
1804
- article {
1805
- min-height: 100%;
1806
- }
1807
- /**
1808
- * MAIN
1809
- */
1810
- main {
1811
- max-width: 1200px;
1812
- margin-inline: auto;
1813
- display: flex;
1814
- justify-content: center;
1815
- align-items: stretch;
1816
- gap: 25px;
1817
- }
1818
- .main-content {
1819
- min-width: 75%;
1820
- width: 75%;
1821
- margin: 0;
1822
- }
1823
- /**
1824
- * SIDEBAR
1825
- */
1826
- .sidebar {
1827
- position: sticky;
1828
- top: 60px;
1829
- max-height: max-content;
1830
- height: 100%;
1831
- margin-bottom: 0;
1832
- padding-top: 60px;
1833
- z-index: 1;
1834
- }
1835
- .sidebar-info {
1836
- flex-direction: column;
1837
- }
1838
- .avatar-box img {
1839
- width: 150px;
1840
- }
1841
- .info-content .name {
1842
- white-space: nowrap;
1843
- text-align: center;
1844
- }
1845
- .info-content .title {
1846
- margin: auto;
1847
- }
1848
- .info_more-btn {
1849
- display: none;
1850
- }
1851
- .sidebar-info_more {
1852
- opacity: 1;
1853
- visibility: visible;
1854
- }
1855
- .contacts-list {
1856
- grid-template-columns: 1fr;
1857
- }
1858
- .contact-info :is(.contact-link) {
1859
- white-space: nowrap;
1860
- overflow: hidden;
1861
- text-overflow: ellipsis;
1862
- }
1863
- .contact-info :is(.contact-link, time, address) {
1864
- --fs-7: 14px;
1865
- font-weight: var(--fw-300);
1866
- }
1867
- .separator:last-of-type {
1868
- margin: 15px 0;
1869
- opacity: 0;
1870
- }
1871
- .social-list {
1872
- justify-content: center;
1873
- }
1874
- /**
1875
- * RESUME
1876
- */
1877
- .timeline-text {
1878
- max-width: 700px;
1879
- }
1880
  }
 
1
+ /*-----------------------------------*\
2
+ #style.css
3
+ \*-----------------------------------*/
4
+
5
+
6
+ /**
7
+ * copyright 2022 @codewithsadee
8
+ */
9
+
10
+
11
+ /*-----------------------------------*\
12
+ #CUSTOM PROPERTY
13
+ \*-----------------------------------*/
14
+
15
+ :root {
16
+ /**
17
+ * colors
18
+ */
19
+ /* gradient */
20
+ --bg-gradient-onyx: linear-gradient( to bottom right, hsl(240, 1%, 25%) 3%, hsl(0, 0%, 19%) 97%);
21
+ --bg-gradient-jet: linear-gradient( to bottom right, hsla(240, 1%, 18%, 0.251) 0%, hsla(240, 2%, 11%, 0) 100%), hsl(240, 2%, 13%);
22
+ --bg-gradient-yellow-1: linear-gradient( to bottom right, hsl(45, 100%, 71%) 0%, hsla(36, 100%, 69%, 0) 50%);
23
+ --bg-gradient-yellow-2: linear-gradient( 135deg, hsla(45, 100%, 71%, 0.251) 0%, hsla(35, 100%, 68%, 0) 59.86%), hsl(240, 2%, 13%);
24
+ --border-gradient-onyx: linear-gradient( to bottom right, hsl(0, 0%, 25%) 0%, hsla(0, 0%, 25%, 0) 50%);
25
+ --text-gradient-yellow: linear-gradient( to right, hsl(45, 100%, 72%), hsl(35, 100%, 68%));
26
+ /* solid */
27
+ --jet: hsl(0, 0%, 22%);
28
+ --onyx: hsl(240, 1%, 17%);
29
+ --eerie-black-1: hsl(240, 2%, 13%);
30
+ --eerie-black-2: hsl(240, 2%, 12%);
31
+ --smoky-black: hsl(0, 0%, 7%);
32
+ --white-1: hsl(0, 0%, 100%);
33
+ --white-2: hsl(0, 0%, 98%);
34
+ --orange-yellow-crayola: hsl(45, 100%, 72%);
35
+ --vegas-gold: hsl(45, 54%, 58%);
36
+ --light-gray: hsl(0, 0%, 84%);
37
+ --light-gray-70: hsla(0, 0%, 84%, 0.7);
38
+ --bittersweet-shimmer: hsl(0, 43%, 51%);
39
+ /**
40
+ * typography
41
+ */
42
+ /* font-family */
43
+ --ff-poppins: 'Poppins', sans-serif;
44
+ /* font-size */
45
+ --fs-1: 24px;
46
+ --fs-2: 18px;
47
+ --fs-3: 17px;
48
+ --fs-4: 16px;
49
+ --fs-5: 15px;
50
+ --fs-6: 14px;
51
+ --fs-7: 13px;
52
+ --fs-8: 11px;
53
+ /* font-weight */
54
+ --fw-300: 300;
55
+ --fw-400: 400;
56
+ --fw-500: 500;
57
+ --fw-600: 600;
58
+ /**
59
+ * shadow
60
+ */
61
+ --shadow-1: -4px 8px 24px hsla(0, 0%, 0%, 0.25);
62
+ --shadow-2: 0 16px 30px hsla(0, 0%, 0%, 0.25);
63
+ --shadow-3: 0 16px 40px hsla(0, 0%, 0%, 0.25);
64
+ --shadow-4: 0 25px 50px hsla(0, 0%, 0%, 0.15);
65
+ --shadow-5: 0 24px 80px hsla(0, 0%, 0%, 0.25);
66
+ /**
67
+ * transition
68
+ */
69
+ --transition-1: 0.25s ease;
70
+ --transition-2: 0.5s ease-in-out;
71
+ }
72
+
73
+
74
+ /*-----------------------------------*\
75
+ #RESET
76
+ \*-----------------------------------*/
77
+
78
+ *,
79
+ *::before,
80
+ *::after {
81
+ margin: 0;
82
+ padding: 0;
83
+ box-sizing: border-box;
84
+ }
85
+
86
+ a {
87
+ text-decoration: none;
88
+ }
89
+
90
+ li {
91
+ list-style: none;
92
+ }
93
+
94
+ img,
95
+ ion-icon,
96
+ a,
97
+ button,
98
+ time,
99
+ span {
100
+ display: block;
101
+ }
102
+
103
+ button {
104
+ font: inherit;
105
+ background: none;
106
+ border: none;
107
+ text-align: left;
108
+ cursor: pointer;
109
+ }
110
+
111
+ input,
112
+ textarea {
113
+ display: block;
114
+ width: 100%;
115
+ background: none;
116
+ font: inherit;
117
+ }
118
+
119
+ ::selection {
120
+ background: var(--orange-yellow-crayola);
121
+ color: var(--smoky-black);
122
+ }
123
+
124
+ :focus {
125
+ outline-color: var(--orange-yellow-crayola);
126
+ }
127
+
128
+ html {
129
+ font-family: var(--ff-poppins);
130
+ }
131
+
132
+ body {
133
+ background: var(--smoky-black);
134
+ }
135
+
136
+
137
+ /*-----------------------------------*\
138
+ #REUSED STYLE
139
+ \*-----------------------------------*/
140
+
141
+ .sidebar,
142
+ article {
143
+ background: var(--eerie-black-2);
144
+ border: 1px solid var(--jet);
145
+ border-radius: 20px;
146
+ padding: 15px;
147
+ box-shadow: var(--shadow-1);
148
+ z-index: 1;
149
+ }
150
+
151
+ .separator {
152
+ width: 100%;
153
+ height: 1px;
154
+ background: var(--jet);
155
+ margin: 16px 0;
156
+ }
157
+
158
+ .icon-box {
159
+ position: relative;
160
+ background: var(--border-gradient-onyx);
161
+ width: 30px;
162
+ height: 30px;
163
+ border-radius: 8px;
164
+ display: flex;
165
+ justify-content: center;
166
+ align-items: center;
167
+ font-size: 16px;
168
+ color: var(--orange-yellow-crayola);
169
+ box-shadow: var(--shadow-1);
170
+ z-index: 1;
171
+ }
172
+
173
+ .icon-box::before {
174
+ content: "";
175
+ position: absolute;
176
+ inset: 1px;
177
+ background: var(--eerie-black-1);
178
+ border-radius: inherit;
179
+ z-index: -1;
180
+ }
181
+
182
+ .icon-box ion-icon {
183
+ --ionicon-stroke-width: 35px;
184
+ }
185
+
186
+ article {
187
+ display: none;
188
+ }
189
+
190
+ article.active {
191
+ display: block;
192
+ animation: fade 0.5s ease backwards;
193
+ }
194
+
195
+ @keyframes fade {
196
+ 0% {
197
+ opacity: 0;
198
+ }
199
+ 100% {
200
+ opacity: 1;
201
+ }
202
+ }
203
+
204
+ .h2,
205
+ .h3,
206
+ .h4,
207
+ .h5 {
208
+ color: var(--white-2);
209
+ text-transform: capitalize;
210
+ }
211
+
212
+ .h2 {
213
+ font-size: var(--fs-1);
214
+ }
215
+
216
+ .h3 {
217
+ font-size: var(--fs-2);
218
+ }
219
+
220
+ .h4 {
221
+ font-size: var(--fs-4);
222
+ }
223
+
224
+ .h5 {
225
+ font-size: var(--fs-7);
226
+ font-weight: var(--fw-500);
227
+ }
228
+
229
+ .article-title {
230
+ position: relative;
231
+ padding-bottom: 7px;
232
+ }
233
+
234
+ .article-title::after {
235
+ content: "";
236
+ position: absolute;
237
+ bottom: 0;
238
+ left: 0;
239
+ width: 30px;
240
+ height: 3px;
241
+ background: var(--text-gradient-yellow);
242
+ border-radius: 3px;
243
+ }
244
+
245
+ .has-scrollbar::-webkit-scrollbar {
246
+ width: 5px;
247
+ /* for vertical scrollbar */
248
+ height: 5px;
249
+ /* for horizontal scrollbar */
250
+ }
251
+
252
+ .has-scrollbar::-webkit-scrollbar-track {
253
+ background: var(--onyx);
254
+ border-radius: 5px;
255
+ }
256
+
257
+ .has-scrollbar::-webkit-scrollbar-thumb {
258
+ background: var(--orange-yellow-crayola);
259
+ border-radius: 5px;
260
+ }
261
+
262
+ .has-scrollbar::-webkit-scrollbar-button {
263
+ width: 20px;
264
+ }
265
+
266
+ .content-card {
267
+ position: relative;
268
+ background: var(--border-gradient-onyx);
269
+ padding: 15px;
270
+ padding-top: 45px;
271
+ border-radius: 14px;
272
+ box-shadow: var(--shadow-2);
273
+ cursor: pointer;
274
+ z-index: 1;
275
+ }
276
+
277
+ .content-card::before {
278
+ content: "";
279
+ position: absolute;
280
+ inset: 1px;
281
+ background: var(--bg-gradient-jet);
282
+ border-radius: inherit;
283
+ z-index: -1;
284
+ }
285
+
286
+
287
+ /*-----------------------------------*\
288
+ #MAIN
289
+ \*-----------------------------------*/
290
+
291
+ main {
292
+ margin: 15px 12px;
293
+ margin-bottom: 75px;
294
+ min-width: 259px;
295
+ }
296
+
297
+
298
+ /*-----------------------------------*\
299
+ #SIDEBAR
300
+ \*-----------------------------------*/
301
+
302
+ .sidebar {
303
+ margin-bottom: 15px;
304
+ max-height: 112px;
305
+ overflow: hidden;
306
+ transition: var(--transition-2);
307
+ }
308
+
309
+ .sidebar.active {
310
+ max-height: 405px;
311
+ }
312
+
313
+ .sidebar-info {
314
+ position: relative;
315
+ display: flex;
316
+ justify-content: flex-start;
317
+ align-items: center;
318
+ gap: 15px;
319
+ }
320
+
321
+ .avatar-box {
322
+ background: var(--bg-gradient-onyx);
323
+ border-radius: 20px;
324
+ }
325
+
326
+ .info-content .name {
327
+ color: var(--white-2);
328
+ font-size: var(--fs-3);
329
+ font-weight: var(--fw-500);
330
+ letter-spacing: -0.25px;
331
+ margin-bottom: 10px;
332
+ }
333
+
334
+ .info-content .title {
335
+ color: var(--white-1);
336
+ background: var(--onyx);
337
+ font-size: var(--fs-8);
338
+ font-weight: var(--fw-300);
339
+ width: max-content;
340
+ padding: 3px 12px;
341
+ border-radius: 8px;
342
+ }
343
+
344
+ .info_more-btn {
345
+ position: absolute;
346
+ top: -15px;
347
+ right: -15px;
348
+ border-radius: 0 15px;
349
+ font-size: 13px;
350
+ color: var(--orange-yellow-crayola);
351
+ background: var(--border-gradient-onyx);
352
+ padding: 10px;
353
+ box-shadow: var(--shadow-2);
354
+ transition: var(--transition-1);
355
+ z-index: 1;
356
+ }
357
+
358
+ .info_more-btn::before {
359
+ content: "";
360
+ position: absolute;
361
+ inset: 1px;
362
+ border-radius: inherit;
363
+ background: var(--bg-gradient-jet);
364
+ transition: var(--transition-1);
365
+ z-index: -1;
366
+ }
367
+
368
+ .info_more-btn:hover,
369
+ .info_more-btn:focus {
370
+ background: var(--bg-gradient-yellow-1);
371
+ }
372
+
373
+ .info_more-btn:hover::before,
374
+ .info_more-btn:focus::before {
375
+ background: var(--bg-gradient-yellow-2);
376
+ }
377
+
378
+ .info_more-btn span {
379
+ display: none;
380
+ }
381
+
382
+ .sidebar-info_more {
383
+ opacity: 0;
384
+ visibility: hidden;
385
+ transition: var(--transition-2);
386
+ }
387
+
388
+ .sidebar.active .sidebar-info_more {
389
+ opacity: 1;
390
+ visibility: visible;
391
+ }
392
+
393
+ .contacts-list {
394
+ display: grid;
395
+ grid-template-columns: 1fr;
396
+ gap: 16px;
397
+ }
398
+
399
+ .contact-item {
400
+ min-width: 100%;
401
+ display: flex;
402
+ align-items: center;
403
+ gap: 16px;
404
+ }
405
+
406
+ .contact-info {
407
+ max-width: calc(100% - 46px);
408
+ width: calc(100% - 46px);
409
+ }
410
+
411
+ .contact-title {
412
+ color: var(--light-gray-70);
413
+ font-size: var(--fs-8);
414
+ text-transform: uppercase;
415
+ margin-bottom: 2px;
416
+ }
417
+
418
+ .contact-info :is(.contact-link, time, address) {
419
+ color: var(--white-2);
420
+ font-size: var(--fs-7);
421
+ }
422
+
423
+ .contact-info address {
424
+ font-style: normal;
425
+ }
426
+
427
+ .social-list {
428
+ display: flex;
429
+ justify-content: flex-start;
430
+ align-items: center;
431
+ gap: 15px;
432
+ padding-bottom: 4px;
433
+ padding-left: 7px;
434
+ }
435
+
436
+ .social-item .social-link {
437
+ color: var(--light-gray-70);
438
+ font-size: 18px;
439
+ }
440
+
441
+ .social-item .social-link:hover {
442
+ color: var(--light-gray);
443
+ }
444
+
445
+
446
+ /*-----------------------------------*\
447
+ #NAVBAR
448
+ \*-----------------------------------*/
449
+
450
+ .navbar {
451
+ position: fixed;
452
+ bottom: 0;
453
+ left: 0;
454
+ width: 100%;
455
+ background: hsla(240, 1%, 17%, 0.75);
456
+ backdrop-filter: blur(10px);
457
+ border: 1px solid var(--jet);
458
+ border-radius: 12px 12px 0 0;
459
+ box-shadow: var(--shadow-2);
460
+ z-index: 5;
461
+ }
462
+
463
+ .navbar-list {
464
+ display: flex;
465
+ flex-wrap: wrap;
466
+ justify-content: center;
467
+ align-items: center;
468
+ padding: 0 10px;
469
+ }
470
+
471
+ .navbar-link {
472
+ color: var(--light-gray);
473
+ font-size: var(--fs-8);
474
+ padding: 20px 7px;
475
+ transition: color var(--transition-1);
476
+ }
477
+
478
+ .navbar-link:hover,
479
+ .navbar-link:focus {
480
+ color: var(--light-gray-70);
481
+ }
482
+
483
+ .navbar-link.active {
484
+ color: var(--orange-yellow-crayola);
485
+ }
486
+
487
+
488
+ /*-----------------------------------*\
489
+ #ABOUT
490
+ \*-----------------------------------*/
491
+
492
+ .about .article-title {
493
+ margin-bottom: 15px;
494
+ }
495
+
496
+ .about-text {
497
+ color: var(--light-gray);
498
+ font-size: var(--fs-6);
499
+ font-weight: var(--fw-300);
500
+ line-height: 1.6;
501
+ }
502
+
503
+ .about-text p {
504
+ margin-bottom: 15px;
505
+ }
506
+
507
+
508
+ /**
509
+ * #service
510
+ */
511
+
512
+ .service {
513
+ margin-bottom: 35px;
514
+ }
515
+
516
+ .service-title {
517
+ margin-bottom: 20px;
518
+ }
519
+
520
+ .service-list {
521
+ display: grid;
522
+ grid-template-columns: 1fr;
523
+ gap: 20px;
524
+ }
525
+
526
+ .service-item {
527
+ position: relative;
528
+ background: var(--border-gradient-onyx);
529
+ padding: 20px;
530
+ border-radius: 14px;
531
+ box-shadow: var(--shadow-2);
532
+ z-index: 1;
533
+ }
534
+
535
+ .service-item::before {
536
+ content: "";
537
+ position: absolute;
538
+ inset: 1px;
539
+ background: var(--bg-gradient-jet);
540
+ border-radius: inherit;
541
+ z-index: -1;
542
+ }
543
+
544
+ .service-icon-box {
545
+ margin-bottom: 10px;
546
+ }
547
+
548
+ .service-icon-box img {
549
+ margin: auto;
550
+ }
551
+
552
+ .service-content-box {
553
+ text-align: center;
554
+ }
555
+
556
+ .service-item-title {
557
+ margin-bottom: 7px;
558
+ }
559
+
560
+ .service-item-text {
561
+ color: var(--light-gray);
562
+ font-size: var(--fs-6);
563
+ font-weight: var(--fw-3);
564
+ line-height: 1.6;
565
+ }
566
+
567
+
568
+ /**
569
+ * #testimonials
570
+ */
571
+
572
+ .testimonials {
573
+ margin-bottom: 30px;
574
+ }
575
+
576
+ .testimonials-title {
577
+ margin-bottom: 20px;
578
+ }
579
+
580
+ .testimonials-list {
581
+ display: flex;
582
+ justify-content: flex-start;
583
+ align-items: flex-start;
584
+ gap: 15px;
585
+ margin: 0 -15px;
586
+ padding: 25px 15px;
587
+ padding-bottom: 35px;
588
+ overflow-x: auto;
589
+ scroll-behavior: smooth;
590
+ overscroll-behavior-inline: contain;
591
+ scroll-snap-type: inline mandatory;
592
+ }
593
+
594
+ .testimonials-item {
595
+ min-width: 100%;
596
+ scroll-snap-align: center;
597
+ }
598
+
599
+ .testimonials-avatar-box {
600
+ position: absolute;
601
+ top: 0;
602
+ left: 0;
603
+ transform: translate(15px, -25px);
604
+ background: var(--bg-gradient-onyx);
605
+ border-radius: 14px;
606
+ box-shadow: var(--shadow-1);
607
+ }
608
+
609
+ .testimonials-item-title {
610
+ margin-bottom: 7px;
611
+ }
612
+
613
+ .testimonials-text {
614
+ color: var(--light-gray);
615
+ font-size: var(--fs-6);
616
+ font-weight: var(--fw-300);
617
+ line-height: 1.6;
618
+ display: -webkit-box;
619
+ line-clamp: 4;
620
+ -webkit-line-clamp: 4;
621
+ -webkit-box-orient: vertical;
622
+ overflow: hidden;
623
+ }
624
+
625
+
626
+ /**
627
+ * #testimonials-modal
628
+ */
629
+
630
+ .modal-container {
631
+ position: fixed;
632
+ top: 0;
633
+ left: 0;
634
+ width: 100%;
635
+ height: 100%;
636
+ display: flex;
637
+ justify-content: center;
638
+ align-items: center;
639
+ overflow-y: auto;
640
+ overscroll-behavior: contain;
641
+ z-index: 20;
642
+ pointer-events: none;
643
+ visibility: hidden;
644
+ }
645
+
646
+ .modal-container::-webkit-scrollbar {
647
+ display: none;
648
+ }
649
+
650
+ .modal-container.active {
651
+ pointer-events: all;
652
+ visibility: visible;
653
+ }
654
+
655
+ .overlay {
656
+ position: fixed;
657
+ top: 0;
658
+ left: 0;
659
+ width: 100%;
660
+ height: 100vh;
661
+ background: hsl(0, 0%, 5%);
662
+ opacity: 0;
663
+ visibility: hidden;
664
+ pointer-events: none;
665
+ z-index: 1;
666
+ transition: var(--transition-1);
667
+ }
668
+
669
+ .overlay.active {
670
+ opacity: 0.8;
671
+ visibility: visible;
672
+ pointer-events: all;
673
+ }
674
+
675
+ .testimonials-modal {
676
+ background: var(--eerie-black-2);
677
+ position: relative;
678
+ padding: 15px;
679
+ margin: 15px 12px;
680
+ border: 1px solid var(--jet);
681
+ border-radius: 14px;
682
+ box-shadow: var(--shadow-5);
683
+ transform: scale(1.2);
684
+ opacity: 0;
685
+ transition: var(--transition-1);
686
+ z-index: 2;
687
+ }
688
+
689
+ .modal-container.active .testimonials-modal {
690
+ transform: scale(1);
691
+ opacity: 1;
692
+ }
693
+
694
+ .modal-close-btn {
695
+ position: absolute;
696
+ top: 15px;
697
+ right: 15px;
698
+ background: var(--onyx);
699
+ border-radius: 8px;
700
+ width: 32px;
701
+ height: 32px;
702
+ display: flex;
703
+ justify-content: center;
704
+ align-items: center;
705
+ color: var(--white-2);
706
+ font-size: 18px;
707
+ opacity: 0.7;
708
+ }
709
+
710
+ .modal-close-btn:hover,
711
+ .modal-close-btn:focus {
712
+ opacity: 1;
713
+ }
714
+
715
+ .modal-close-btn ion-icon {
716
+ --ionicon-stroke-width: 50px;
717
+ }
718
+
719
+ .modal-avatar-box {
720
+ background: var(--bg-gradient-onyx);
721
+ width: max-content;
722
+ border-radius: 14px;
723
+ margin-bottom: 15px;
724
+ box-shadow: var(--shadow-2);
725
+ }
726
+
727
+ .modal-img-wrapper>img {
728
+ display: none;
729
+ }
730
+
731
+ .modal-title {
732
+ margin-bottom: 4px;
733
+ }
734
+
735
+ .modal-content time {
736
+ font-size: var(--fs-6);
737
+ color: var(--light-gray-70);
738
+ font-weight: var(--fw-300);
739
+ margin-bottom: 10px;
740
+ }
741
+
742
+ .modal-content p {
743
+ color: var(--light-gray);
744
+ font-size: var(--fs-6);
745
+ font-weight: var(--fw-300);
746
+ line-height: 1.6;
747
+ }
748
+
749
+
750
+ /**
751
+ * #clients
752
+ */
753
+
754
+ .clients {
755
+ margin-bottom: 15px;
756
+ }
757
+
758
+ .clients-list {
759
+ display: flex;
760
+ justify-content: flex-start;
761
+ align-items: flex-start;
762
+ gap: 15px;
763
+ margin: 0 -15px;
764
+ padding: 25px;
765
+ padding-bottom: 25px;
766
+ overflow-x: auto;
767
+ scroll-behavior: smooth;
768
+ overscroll-behavior-inline: contain;
769
+ scroll-snap-type: inline mandatory;
770
+ scroll-padding-inline: 25px;
771
+ }
772
+
773
+ .clients-item {
774
+ min-width: 50%;
775
+ scroll-snap-align: start;
776
+ }
777
+
778
+ .clients-item img {
779
+ width: 100%;
780
+ filter: grayscale(1);
781
+ transition: var(--transition-1);
782
+ }
783
+
784
+ .clients-item img:hover {
785
+ filter: grayscale(0);
786
+ }
787
+
788
+
789
+ /*-----------------------------------*\
790
+ #RESUME
791
+ \*-----------------------------------*/
792
+
793
+ .article-title {
794
+ margin-bottom: 30px;
795
+ }
796
+
797
+
798
+ /**
799
+ * education and experience
800
+ */
801
+
802
+ .timeline {
803
+ margin-bottom: 30px;
804
+ }
805
+
806
+ .timeline .title-wrapper {
807
+ display: flex;
808
+ align-items: center;
809
+ gap: 15px;
810
+ margin-bottom: 25px;
811
+ }
812
+
813
+ .timeline-list {
814
+ font-size: var(--fs-6);
815
+ margin-left: 45px;
816
+ }
817
+
818
+ .timeline-item {
819
+ position: relative;
820
+ }
821
+
822
+ .timeline-item:not(:last-child) {
823
+ margin-bottom: 20px;
824
+ }
825
+
826
+ .timeline-item-title {
827
+ font-size: var(--fs-6);
828
+ line-height: 1.3;
829
+ margin-bottom: 7px;
830
+ }
831
+
832
+ .timeline-list span {
833
+ color: var(--vegas-gold);
834
+ font-weight: var(--fw-400);
835
+ line-height: 1.6;
836
+ }
837
+
838
+ .timeline-item:not(:last-child)::before {
839
+ content: "";
840
+ position: absolute;
841
+ top: -25px;
842
+ left: -30px;
843
+ width: 1px;
844
+ height: calc(100% + 50px);
845
+ background: var(--jet);
846
+ }
847
+
848
+ .timeline-item::after {
849
+ content: "";
850
+ position: absolute;
851
+ top: 5px;
852
+ left: -33px;
853
+ height: 6px;
854
+ width: 6px;
855
+ background: var(--text-gradient-yellow);
856
+ border-radius: 50%;
857
+ box-shadow: 0 0 0 4px var(--jet);
858
+ }
859
+
860
+ .timeline-text {
861
+ color: var(--light-gray);
862
+ font-weight: var(--fw-300);
863
+ line-height: 1.6;
864
+ }
865
+
866
+
867
+ /**
868
+ * skills
869
+ */
870
+
871
+ .skills-title {
872
+ margin-bottom: 20px;
873
+ }
874
+
875
+ .skills-list {
876
+ padding: 20px;
877
+ }
878
+
879
+ .skills-item:not(:last-child) {
880
+ margin-bottom: 15px;
881
+ }
882
+
883
+ .skill .title-wrapper {
884
+ display: flex;
885
+ align-items: center;
886
+ gap: 5px;
887
+ margin-bottom: 8px;
888
+ }
889
+
890
+ .skill .title-wrapper data {
891
+ color: var(--light-gray);
892
+ font-size: var(--fs-7);
893
+ font-weight: var(--fw-300);
894
+ }
895
+
896
+ .skill-progress-bg {
897
+ background: var(--jet);
898
+ width: 100%;
899
+ height: 8px;
900
+ border-radius: 10px;
901
+ }
902
+
903
+ .skill-progress-fill {
904
+ background: var(--text-gradient-yellow);
905
+ height: 100%;
906
+ border-radius: inherit;
907
+ }
908
+
909
+
910
+ /*-----------------------------------*\
911
+ #PORTFOLIO
912
+ \*-----------------------------------*/
913
+
914
+ .filter-list {
915
+ display: none;
916
+ }
917
+
918
+ .filter-select-box {
919
+ position: relative;
920
+ margin-bottom: 25px;
921
+ }
922
+
923
+ .filter-select {
924
+ background: var(--eerie-black-2);
925
+ color: var(--light-gray);
926
+ display: flex;
927
+ justify-content: space-between;
928
+ align-items: center;
929
+ width: 100%;
930
+ padding: 12px 16px;
931
+ border: 1px solid var(--jet);
932
+ border-radius: 14px;
933
+ font-size: var(--fs-6);
934
+ font-weight: var(--fw-300);
935
+ }
936
+
937
+ .filter-select.active .select-icon {
938
+ transform: rotate(0.5turn);
939
+ }
940
+
941
+ .select-list {
942
+ background: var(--eerie-black-2);
943
+ position: absolute;
944
+ top: calc(100% + 6px);
945
+ width: 100%;
946
+ padding: 6px;
947
+ border: 1px solid var(--jet);
948
+ border-radius: 14px;
949
+ z-index: 2;
950
+ opacity: 0;
951
+ visibility: hidden;
952
+ pointer-events: none;
953
+ transition: 0.15s ease-in-out;
954
+ }
955
+
956
+ .filter-select.active+.select-list {
957
+ opacity: 1;
958
+ visibility: visible;
959
+ pointer-events: all;
960
+ }
961
+
962
+ .select-item button {
963
+ background: var(--eerie-black-2);
964
+ color: var(--light-gray);
965
+ font-size: var(--fs-6);
966
+ font-weight: var(--fw-300);
967
+ text-transform: capitalize;
968
+ width: 100%;
969
+ padding: 8px 10px;
970
+ border-radius: 8px;
971
+ }
972
+
973
+ .select-item button:hover {
974
+ --eerie-black-2: hsl(240, 2%, 20%);
975
+ }
976
+
977
+ .project-list {
978
+ display: grid;
979
+ grid-template-columns: 1fr;
980
+ gap: 30px;
981
+ margin-bottom: 10px;
982
+ }
983
+
984
+ .project-item {
985
+ display: none;
986
+ }
987
+
988
+ .project-item.active {
989
+ display: block;
990
+ animation: scaleUp 0.25s ease forwards;
991
+ }
992
+
993
+ @keyframes scaleUp {
994
+ 0% {
995
+ transform: scale(0.5);
996
+ }
997
+ 100% {
998
+ transform: scale(1);
999
+ }
1000
+ }
1001
+
1002
+ .project-item>a {
1003
+ width: 100%;
1004
+ }
1005
+
1006
+ .project-img {
1007
+ position: relative;
1008
+ width: 100%;
1009
+ height: 200px;
1010
+ border-radius: 16px;
1011
+ overflow: hidden;
1012
+ margin-bottom: 15px;
1013
+ }
1014
+
1015
+ .project-img::before {
1016
+ content: "";
1017
+ position: absolute;
1018
+ top: 0;
1019
+ left: 0;
1020
+ width: 100%;
1021
+ height: 100%;
1022
+ background: transparent;
1023
+ z-index: 1;
1024
+ transition: var(--transition-1);
1025
+ }
1026
+
1027
+ .project-item>a:hover .project-img::before {
1028
+ background: hsla(0, 0%, 0%, 0.5);
1029
+ }
1030
+
1031
+ .project-item-icon-box {
1032
+ --scale: 0.8;
1033
+ background: var(--jet);
1034
+ color: var(--orange-yellow-crayola);
1035
+ position: absolute;
1036
+ top: 50%;
1037
+ left: 50%;
1038
+ transform: translate(-50%, -50%) scale(var(--scale));
1039
+ font-size: 20px;
1040
+ padding: 18px;
1041
+ border-radius: 12px;
1042
+ opacity: 0;
1043
+ z-index: 1;
1044
+ transition: var(--transition-1);
1045
+ }
1046
+
1047
+ .project-item>a:hover .project-item-icon-box {
1048
+ --scale: 1;
1049
+ opacity: 1;
1050
+ }
1051
+
1052
+ .project-item-icon-box ion-icon {
1053
+ --ionicon-stroke-width: 50px;
1054
+ }
1055
+
1056
+ .project-img video {
1057
+ width: 100%;
1058
+ height: 100%;
1059
+ object-fit: cover;
1060
+ transition: var(--transition-1);
1061
+ }
1062
+
1063
+ .project-img img {
1064
+ width: 105%;
1065
+ min-height: 200px;
1066
+ transition: var(--transition-1);
1067
+ margin: 9px;
1068
+ }
1069
+
1070
+ .project-item>a:hover img {
1071
+ transform: scale(1.1);
1072
+ }
1073
+
1074
+ .project-title,
1075
+ .project-category {
1076
+ margin-left: 10px;
1077
+ }
1078
+
1079
+ .project-title {
1080
+ color: var(--white-2);
1081
+ font-size: var(--fs-5);
1082
+ font-weight: var(--fw-400);
1083
+ text-transform: capitalize;
1084
+ line-height: 1.3;
1085
+ }
1086
+
1087
+ .project-category {
1088
+ color: var(--light-gray-70);
1089
+ font-size: var(--fs-6);
1090
+ font-weight: var(--fw-300);
1091
+ }
1092
+
1093
+
1094
+ /*-----------------------------------*\
1095
+ #BLOG
1096
+ \*-----------------------------------*/
1097
+
1098
+ .blog-posts {
1099
+ margin-bottom: 10px;
1100
+ }
1101
+
1102
+ .blog-posts-list {
1103
+ display: grid;
1104
+ grid-template-columns: 1fr;
1105
+ gap: 20px;
1106
+ }
1107
+
1108
+ .blog-post-item>a {
1109
+ position: relative;
1110
+ background: var(--border-gradient-onyx);
1111
+ height: 100%;
1112
+ box-shadow: var(--shadow-4);
1113
+ border-radius: 16px;
1114
+ z-index: 1;
1115
+ }
1116
+
1117
+ .blog-post-item>a::before {
1118
+ content: "";
1119
+ position: absolute;
1120
+ inset: 1px;
1121
+ border-radius: inherit;
1122
+ background: var(--eerie-black-1);
1123
+ z-index: -1;
1124
+ }
1125
+
1126
+ .blog-banner-box {
1127
+ width: 100%;
1128
+ height: 200px;
1129
+ border-radius: 12px;
1130
+ overflow: hidden;
1131
+ }
1132
+
1133
+ .blog-banner-box img {
1134
+ width: 100%;
1135
+ height: 100%;
1136
+ object-fit: cover;
1137
+ transition: var(--transition-1);
1138
+ }
1139
+
1140
+ .blog-post-item>a:hover .blog-banner-box img {
1141
+ transform: scale(1.1);
1142
+ }
1143
+
1144
+ .blog-content {
1145
+ padding: 15px;
1146
+ }
1147
+
1148
+ .blog-meta {
1149
+ display: flex;
1150
+ justify-content: flex-start;
1151
+ align-items: center;
1152
+ gap: 7px;
1153
+ margin-bottom: 10px;
1154
+ }
1155
+
1156
+ .blog-meta :is(.blog-category, time) {
1157
+ color: var(--light-gray-70);
1158
+ font-size: var(--fs-6);
1159
+ font-weight: var(--fw-300);
1160
+ }
1161
+
1162
+ .blog-meta .dot {
1163
+ background: var(--light-gray-70);
1164
+ width: 4px;
1165
+ height: 4px;
1166
+ border-radius: 4px;
1167
+ }
1168
+
1169
+ .blog-item-title {
1170
+ margin-bottom: 10px;
1171
+ line-height: 1.3;
1172
+ transition: var(--transition-1);
1173
+ }
1174
+
1175
+ .blog-post-item>a:hover .blog-item-title {
1176
+ color: var(--orange-yellow-crayola);
1177
+ }
1178
+
1179
+ .blog-text {
1180
+ color: var(--light-gray);
1181
+ font-size: var(--fs-6);
1182
+ font-weight: var(--fw-300);
1183
+ line-height: 1.6;
1184
+ }
1185
+
1186
+
1187
+ /*-----------------------------------*\
1188
+ #CONTACT
1189
+ \*-----------------------------------*/
1190
+
1191
+ .mapbox {
1192
+ position: relative;
1193
+ height: 250px;
1194
+ width: 100%;
1195
+ border-radius: 16px;
1196
+ margin-bottom: 30px;
1197
+ border: 1px solid var(--jet);
1198
+ overflow: hidden;
1199
+ }
1200
+
1201
+ .mapbox figure {
1202
+ height: 100%;
1203
+ }
1204
+
1205
+ .mapbox iframe {
1206
+ width: 100%;
1207
+ height: 100%;
1208
+ border: none;
1209
+ filter: grayscale(1) invert(1);
1210
+ }
1211
+
1212
+ .contact-form {
1213
+ margin-bottom: 10px;
1214
+ }
1215
+
1216
+ .form-title {
1217
+ margin-bottom: 20px;
1218
+ }
1219
+
1220
+ .input-wrapper {
1221
+ display: grid;
1222
+ grid-template-columns: 1fr;
1223
+ gap: 25px;
1224
+ margin-bottom: 25px;
1225
+ }
1226
+
1227
+ .form-input {
1228
+ color: var(--white-2);
1229
+ font-size: var(--fs-6);
1230
+ font-weight: var(--fw-400);
1231
+ padding: 13px 20px;
1232
+ border: 1px solid var(--jet);
1233
+ border-radius: 14px;
1234
+ outline: none;
1235
+ }
1236
+
1237
+ .form-input::placeholder {
1238
+ font-weight: var(--fw-500);
1239
+ }
1240
+
1241
+ .form-input:focus {
1242
+ border-color: var(--orange-yellow-crayola);
1243
+ }
1244
+
1245
+ textarea.form-input {
1246
+ min-height: 100px;
1247
+ height: 120px;
1248
+ max-height: 200px;
1249
+ resize: vertical;
1250
+ margin-bottom: 25px;
1251
+ }
1252
+
1253
+ textarea.form-input::-webkit-resizer {
1254
+ display: none;
1255
+ }
1256
+
1257
+ .form-input:focus:invalid {
1258
+ border-color: var(--bittersweet-shimmer);
1259
+ }
1260
+
1261
+ .form-btn {
1262
+ position: relative;
1263
+ width: 100%;
1264
+ background: var(--border-gradient-onyx);
1265
+ color: var(--orange-yellow-crayola);
1266
+ display: flex;
1267
+ justify-content: center;
1268
+ align-items: center;
1269
+ gap: 10px;
1270
+ padding: 13px 20px;
1271
+ border-radius: 14px;
1272
+ font-size: var(--fs-6);
1273
+ text-transform: capitalize;
1274
+ box-shadow: var(--shadow-3);
1275
+ z-index: 1;
1276
+ transition: var(--transition-1);
1277
+ }
1278
+
1279
+ .form-btn::before {
1280
+ content: "";
1281
+ position: absolute;
1282
+ inset: 1px;
1283
+ background: var(--bg-gradient-jet);
1284
+ border-radius: inherit;
1285
+ z-index: -1;
1286
+ transition: var(--transition-1);
1287
+ }
1288
+
1289
+ .form-btn ion-icon {
1290
+ font-size: 16px;
1291
+ }
1292
+
1293
+ .form-btn:hover {
1294
+ background: var(--bg-gradient-yellow-1);
1295
+ }
1296
+
1297
+ .form-btn:hover::before {
1298
+ background: var(--bg-gradient-yellow-2);
1299
+ }
1300
+
1301
+ .form-btn:disabled {
1302
+ opacity: 0.7;
1303
+ cursor: not-allowed;
1304
+ }
1305
+
1306
+ .form-btn:disabled:hover {
1307
+ background: var(--border-gradient-onyx);
1308
+ }
1309
+
1310
+ .form-btn:disabled:hover::before {
1311
+ background: var(--bg-gradient-jet);
1312
+ }
1313
+
1314
+
1315
+ /*-----------------------------------*\
1316
+ #RESPONSIVE
1317
+ \*-----------------------------------*/
1318
+
1319
+
1320
+ /**
1321
+ * responsive larger than 450px screen
1322
+ */
1323
+
1324
+ @media (min-width: 450px) {
1325
+ /**
1326
+ * client
1327
+ */
1328
+ .clients-item {
1329
+ min-width: calc(33.33% - 10px);
1330
+ }
1331
+ /**
1332
+ * #PORTFOLIO, BLOG
1333
+ */
1334
+ .project-img,
1335
+ .blog-banner-box {
1336
+ height: auto;
1337
+ }
1338
+ }
1339
+
1340
+
1341
+ /**
1342
+ * responsive larger than 580px screen
1343
+ */
1344
+
1345
+ @media (min-width: 580px) {
1346
+ /**
1347
+ * CUSTOM PROPERTY
1348
+ */
1349
+ :root {
1350
+ /**
1351
+ * typography
1352
+ */
1353
+ --fs-1: 32px;
1354
+ --fs-2: 24px;
1355
+ --fs-3: 26px;
1356
+ --fs-4: 18px;
1357
+ --fs-6: 15px;
1358
+ --fs-7: 15px;
1359
+ --fs-8: 12px;
1360
+ }
1361
+ /**
1362
+ * #REUSED STYLE
1363
+ */
1364
+ .sidebar,
1365
+ article {
1366
+ width: 520px;
1367
+ margin-inline: auto;
1368
+ padding: 30px;
1369
+ }
1370
+ .article-title {
1371
+ font-weight: var(--fw-600);
1372
+ padding-bottom: 15px;
1373
+ }
1374
+ .article-title::after {
1375
+ width: 40px;
1376
+ height: 5px;
1377
+ }
1378
+ .icon-box {
1379
+ width: 48px;
1380
+ height: 48px;
1381
+ border-radius: 12px;
1382
+ font-size: 18px;
1383
+ }
1384
+ /**
1385
+ * #MAIN
1386
+ */
1387
+ main {
1388
+ margin-top: 60px;
1389
+ margin-bottom: 100px;
1390
+ }
1391
+ /**
1392
+ * #SIDEBAR
1393
+ */
1394
+ .sidebar {
1395
+ max-height: 180px;
1396
+ margin-bottom: 30px;
1397
+ }
1398
+ .sidebar.active {
1399
+ max-height: 584px;
1400
+ }
1401
+ .sidebar-info {
1402
+ gap: 25px;
1403
+ }
1404
+ .avatar-box {
1405
+ border-radius: 30px;
1406
+ }
1407
+ .avatar-box img {
1408
+ width: 120px;
1409
+ }
1410
+ .info-content .name {
1411
+ margin-bottom: 15px;
1412
+ }
1413
+ .info-content .title {
1414
+ padding: 5px 18px;
1415
+ }
1416
+ .info_more-btn {
1417
+ top: -30px;
1418
+ right: -30px;
1419
+ padding: 10px 15px;
1420
+ }
1421
+ .info_more-btn span {
1422
+ display: block;
1423
+ font-size: var(--fs-8);
1424
+ }
1425
+ .info_more-btn ion-icon {
1426
+ display: none;
1427
+ }
1428
+ .separator {
1429
+ margin: 32px 0;
1430
+ }
1431
+ .contacts-list {
1432
+ gap: 20px;
1433
+ }
1434
+ .contact-info {
1435
+ max-width: calc(100% - 64px);
1436
+ width: calc(100% - 64px);
1437
+ }
1438
+ /**
1439
+ * #NAVBAR
1440
+ */
1441
+ .navbar {
1442
+ border-radius: 20px 20px 0 0;
1443
+ }
1444
+ .navbar-list {
1445
+ gap: 20px;
1446
+ }
1447
+ .navbar-link {
1448
+ --fs-8: 14px;
1449
+ }
1450
+ /**
1451
+ * #ABOUT
1452
+ */
1453
+ .about .article-title {
1454
+ margin-bottom: 20px;
1455
+ }
1456
+ .about-text {
1457
+ margin-bottom: 40px;
1458
+ }
1459
+ /* service */
1460
+ .service-item {
1461
+ display: flex;
1462
+ justify-content: flex-start;
1463
+ align-items: flex-start;
1464
+ gap: 18px;
1465
+ padding: 30px;
1466
+ }
1467
+ .service-icon-box {
1468
+ margin-bottom: 0;
1469
+ margin-top: 5px;
1470
+ }
1471
+ .service-content-box {
1472
+ text-align: left;
1473
+ }
1474
+ /* testimonials */
1475
+ .testimonials-title {
1476
+ margin-bottom: 25px;
1477
+ }
1478
+ .testimonials-list {
1479
+ gap: 30px;
1480
+ margin: 0 -30px;
1481
+ padding: 30px;
1482
+ padding-bottom: 35px;
1483
+ }
1484
+ .content-card {
1485
+ padding: 30px;
1486
+ padding-top: 25px;
1487
+ }
1488
+ .testimonials-avatar-box {
1489
+ transform: translate(30px, -30px);
1490
+ border-radius: 20px;
1491
+ }
1492
+ .testimonials-avatar-box img {
1493
+ width: 80px;
1494
+ }
1495
+ .testimonials-item-title {
1496
+ margin-bottom: 10px;
1497
+ margin-left: 95px;
1498
+ }
1499
+ .testimonials-text {
1500
+ line-clamp: 2;
1501
+ -webkit-line-clamp: 2;
1502
+ }
1503
+ /* testimonials modal */
1504
+ .modal-container {
1505
+ padding: 20px;
1506
+ }
1507
+ .testimonials-modal {
1508
+ display: flex;
1509
+ justify-content: flex-start;
1510
+ align-items: stretch;
1511
+ gap: 25px;
1512
+ padding: 30px;
1513
+ border-radius: 20px;
1514
+ }
1515
+ .modal-img-wrapper {
1516
+ display: flex;
1517
+ flex-direction: column;
1518
+ align-items: center;
1519
+ }
1520
+ .modal-avatar-box {
1521
+ border-radius: 18px;
1522
+ margin-bottom: 0;
1523
+ }
1524
+ .modal-avatar-box img {
1525
+ width: 65px;
1526
+ }
1527
+ .modal-img-wrapper>img {
1528
+ display: block;
1529
+ flex-grow: 1;
1530
+ width: 35px;
1531
+ }
1532
+ /* clients */
1533
+ .clients-list {
1534
+ gap: 50px;
1535
+ margin: 0 -30px;
1536
+ padding: 45px;
1537
+ scroll-padding-inline: 45px;
1538
+ }
1539
+ .clients-item {
1540
+ min-width: calc(33.33% - 35px);
1541
+ }
1542
+ /**
1543
+ * #RESUME
1544
+ */
1545
+ .timeline-list {
1546
+ margin-left: 65px;
1547
+ }
1548
+ .timeline-item:not(:last-child)::before {
1549
+ left: -40px;
1550
+ }
1551
+ .timeline-item::after {
1552
+ height: 8px;
1553
+ width: 8px;
1554
+ left: -43px;
1555
+ }
1556
+ .skills-item:not(:last-child) {
1557
+ margin-bottom: 25px;
1558
+ }
1559
+ /**
1560
+ * #PORTFOLIO, BLOG
1561
+ */
1562
+ .project-img,
1563
+ .blog-banner-box {
1564
+ border-radius: 16px;
1565
+ }
1566
+ .blog-posts-list {
1567
+ gap: 30px;
1568
+ }
1569
+ .blog-content {
1570
+ padding: 25px;
1571
+ }
1572
+ /**
1573
+ * #CONTACT
1574
+ */
1575
+ .mapbox {
1576
+ height: 380px;
1577
+ border-radius: 18px;
1578
+ }
1579
+ .input-wrapper {
1580
+ gap: 30px;
1581
+ margin-bottom: 30px;
1582
+ }
1583
+ .form-input {
1584
+ padding: 15px 20px;
1585
+ }
1586
+ textarea.form-input {
1587
+ margin-bottom: 30px;
1588
+ }
1589
+ .form-btn {
1590
+ --fs-6: 16px;
1591
+ padding: 16px 20px;
1592
+ }
1593
+ .form-btn ion-icon {
1594
+ font-size: 18px;
1595
+ }
1596
+ }
1597
+
1598
+
1599
+ /**
1600
+ * responsive larger than 768px screen
1601
+ */
1602
+
1603
+ @media (min-width: 768px) {
1604
+ /**
1605
+ * REUSED STYLE
1606
+ */
1607
+ .sidebar,
1608
+ article {
1609
+ width: 700px;
1610
+ }
1611
+ .has-scrollbar::-webkit-scrollbar-button {
1612
+ width: 100px;
1613
+ }
1614
+ /**
1615
+ * SIDEBAR
1616
+ */
1617
+ .contacts-list {
1618
+ grid-template-columns: 1fr 1fr;
1619
+ gap: 30px 15px;
1620
+ }
1621
+ /**
1622
+ * NAVBAR
1623
+ */
1624
+ .navbar-link {
1625
+ --fs-8: 15px;
1626
+ }
1627
+ /**
1628
+ * ABOUT
1629
+ */
1630
+ /* testimonials modal */
1631
+ .testimonials-modal {
1632
+ gap: 35px;
1633
+ max-width: 680px;
1634
+ }
1635
+ .modal-avatar-box img {
1636
+ width: 80px;
1637
+ }
1638
+ /**
1639
+ * PORTFOLIO
1640
+ */
1641
+ .article-title {
1642
+ padding-bottom: 20px;
1643
+ }
1644
+ .filter-select-box {
1645
+ display: none;
1646
+ }
1647
+ .filter-list {
1648
+ display: flex;
1649
+ justify-content: flex-start;
1650
+ align-items: center;
1651
+ gap: 25px;
1652
+ padding-left: 5px;
1653
+ margin-bottom: 30px;
1654
+ }
1655
+ .filter-item button {
1656
+ color: var(--light-gray);
1657
+ font-size: var(--fs-5);
1658
+ transition: var(--transition-1);
1659
+ }
1660
+ .filter-item button:hover {
1661
+ color: var(--light-gray-70);
1662
+ }
1663
+ .filter-item button.active {
1664
+ color: var(--orange-yellow-crayola);
1665
+ }
1666
+ /* portfolio and blog grid */
1667
+ .project-list,
1668
+ .blog-posts-list {
1669
+ grid-template-columns: 1fr 1fr;
1670
+ }
1671
+ /**
1672
+ * CONTACT
1673
+ */
1674
+ .input-wrapper {
1675
+ grid-template-columns: 1fr 1fr;
1676
+ }
1677
+ .form-btn {
1678
+ width: max-content;
1679
+ margin-left: auto;
1680
+ }
1681
+ }
1682
+
1683
+
1684
+ /**
1685
+ * responsive larger than 1024px screen
1686
+ */
1687
+
1688
+ @media (min-width: 1024px) {
1689
+ /**
1690
+ * CUSTOM PROPERTY
1691
+ */
1692
+ :root {
1693
+ /**
1694
+ * shadow
1695
+ */
1696
+ --shadow-1: -4px 8px 24px hsla(0, 0%, 0%, 0.125);
1697
+ --shadow-2: 0 16px 30px hsla(0, 0%, 0%, 0.125);
1698
+ --shadow-3: 0 16px 40px hsla(0, 0%, 0%, 0.125);
1699
+ }
1700
+ /**
1701
+ * REUSED STYLE
1702
+ */
1703
+ .sidebar,
1704
+ article {
1705
+ width: 950px;
1706
+ box-shadow: var(--shadow-5);
1707
+ }
1708
+ /**
1709
+ * MAIN
1710
+ */
1711
+ main {
1712
+ margin-bottom: 60px;
1713
+ }
1714
+ .main-content {
1715
+ position: relative;
1716
+ width: max-content;
1717
+ margin: auto;
1718
+ }
1719
+ /**
1720
+ * NAVBAR
1721
+ */
1722
+ .navbar {
1723
+ position: absolute;
1724
+ bottom: auto;
1725
+ top: 0;
1726
+ left: auto;
1727
+ right: 0;
1728
+ width: max-content;
1729
+ border-radius: 0 20px;
1730
+ padding: 0 20px;
1731
+ box-shadow: none;
1732
+ }
1733
+ .navbar-list {
1734
+ gap: 30px;
1735
+ padding: 0 20px;
1736
+ }
1737
+ .navbar-link {
1738
+ font-weight: var(--fw-500);
1739
+ }
1740
+ /**
1741
+ * ABOUT
1742
+ */
1743
+ /* service */
1744
+ .service-list {
1745
+ grid-template-columns: 1fr 1fr;
1746
+ gap: 20px 25px;
1747
+ }
1748
+ /* testimonials */
1749
+ .testimonials-item {
1750
+ min-width: calc(50% - 15px);
1751
+ }
1752
+ /* clients */
1753
+ .clients-item {
1754
+ min-width: calc(25% - 38px);
1755
+ }
1756
+ /**
1757
+ * PORTFOLIO
1758
+ */
1759
+ .project-list {
1760
+ grid-template-columns: repeat(3, 1fr);
1761
+ }
1762
+ /**
1763
+ * BLOG
1764
+ */
1765
+ .blog-banner-box {
1766
+ height: 230px;
1767
+ }
1768
+ }
1769
+
1770
+
1771
+ /**
1772
+ * responsive larger than 1250px screen
1773
+ */
1774
+
1775
+ @media (min-width: 1250px) {
1776
+ /**
1777
+ * RESET
1778
+ */
1779
+ body::-webkit-scrollbar {
1780
+ width: 20px;
1781
+ }
1782
+ body::-webkit-scrollbar-track {
1783
+ background: var(--smoky-black);
1784
+ }
1785
+ body::-webkit-scrollbar-thumb {
1786
+ border: 5px solid var(--smoky-black);
1787
+ background: hsla(0, 0%, 100%, 0.1);
1788
+ border-radius: 20px;
1789
+ box-shadow: inset 1px 1px 0 hsla(0, 0%, 100%, 0.11), inset -1px -1px 0 hsla(0, 0%, 100%, 0.11);
1790
+ }
1791
+ body::-webkit-scrollbar-thumb:hover {
1792
+ background: hsla(0, 0%, 100%, 0.15);
1793
+ }
1794
+ body::-webkit-scrollbar-button {
1795
+ height: 60px;
1796
+ }
1797
+ /**
1798
+ * REUSED STYLE
1799
+ */
1800
+ .sidebar,
1801
+ article {
1802
+ width: auto;
1803
+ }
1804
+ article {
1805
+ min-height: 100%;
1806
+ }
1807
+ /**
1808
+ * MAIN
1809
+ */
1810
+ main {
1811
+ max-width: 1200px;
1812
+ margin-inline: auto;
1813
+ display: flex;
1814
+ justify-content: center;
1815
+ align-items: stretch;
1816
+ gap: 25px;
1817
+ }
1818
+ .main-content {
1819
+ min-width: 75%;
1820
+ width: 75%;
1821
+ margin: 0;
1822
+ }
1823
+ /**
1824
+ * SIDEBAR
1825
+ */
1826
+ .sidebar {
1827
+ position: sticky;
1828
+ top: 60px;
1829
+ max-height: max-content;
1830
+ height: 100%;
1831
+ margin-bottom: 0;
1832
+ padding-top: 60px;
1833
+ z-index: 1;
1834
+ }
1835
+ .sidebar-info {
1836
+ flex-direction: column;
1837
+ }
1838
+ .avatar-box img {
1839
+ width: 150px;
1840
+ }
1841
+ .info-content .name {
1842
+ white-space: nowrap;
1843
+ text-align: center;
1844
+ }
1845
+ .info-content .title {
1846
+ margin: auto;
1847
+ }
1848
+ .info_more-btn {
1849
+ display: none;
1850
+ }
1851
+ .sidebar-info_more {
1852
+ opacity: 1;
1853
+ visibility: visible;
1854
+ }
1855
+ .contacts-list {
1856
+ grid-template-columns: 1fr;
1857
+ }
1858
+ .contact-info :is(.contact-link) {
1859
+ white-space: nowrap;
1860
+ overflow: hidden;
1861
+ text-overflow: ellipsis;
1862
+ }
1863
+ .contact-info :is(.contact-link, time, address) {
1864
+ --fs-7: 14px;
1865
+ font-weight: var(--fw-300);
1866
+ }
1867
+ .separator:last-of-type {
1868
+ margin: 15px 0;
1869
+ opacity: 0;
1870
+ }
1871
+ .social-list {
1872
+ justify-content: center;
1873
+ }
1874
+ /**
1875
+ * RESUME
1876
+ */
1877
+ .timeline-text {
1878
+ max-width: 700px;
1879
+ }
1880
  }
assets/images/icon-app.svg CHANGED
assets/images/icon-design.svg CHANGED
assets/images/icon-dev.svg CHANGED
assets/images/icon-photo.svg CHANGED
assets/images/icon-quote.svg CHANGED
assets/images/logo.svg CHANGED
assets/js/script.js CHANGED
@@ -1,166 +1,166 @@
1
- 'use strict';
2
-
3
-
4
-
5
-
6
-
7
-
8
- // element toggle function
9
- const elementToggleFunc = function(elem) { elem.classList.toggle("active"); }
10
-
11
-
12
-
13
- // sidebar variables
14
- const sidebar = document.querySelector("[data-sidebar]");
15
- const sidebarBtn = document.querySelector("[data-sidebar-btn]");
16
-
17
- // sidebar toggle functionality for mobile
18
- sidebarBtn.addEventListener("click", function() { elementToggleFunc(sidebar); });
19
-
20
-
21
-
22
- // testimonials variables
23
- const testimonialsItem = document.querySelectorAll("[data-testimonials-item]");
24
- const modalContainer = document.querySelector("[data-modal-container]");
25
- const modalCloseBtn = document.querySelector("[data-modal-close-btn]");
26
- const overlay = document.querySelector("[data-overlay]");
27
-
28
- // modal variable
29
- const modalImg = document.querySelector("[data-modal-img]");
30
- const modalTitle = document.querySelector("[data-modal-title]");
31
- const modalText = document.querySelector("[data-modal-text]");
32
-
33
- // modal toggle function
34
- const testimonialsModalFunc = function() {
35
- modalContainer.classList.toggle("active");
36
- overlay.classList.toggle("active");
37
- }
38
-
39
-
40
- // add click event to all modal items
41
- for (let i = 0; i < testimonialsItem.length; i++) {
42
-
43
- testimonialsItem[i].addEventListener("click", function() {
44
-
45
- modalImg.src = this.querySelector("[data-testimonials-avatar]").src;
46
- modalImg.alt = this.querySelector("[data-testimonials-avatar]").alt;
47
- modalTitle.innerHTML = this.querySelector("[data-testimonials-title]").innerHTML;
48
- modalText.innerHTML = this.querySelector("[data-testimonials-text]").innerHTML;
49
-
50
- testimonialsModalFunc();
51
-
52
- });
53
-
54
- }
55
-
56
-
57
- // add click event to modal close button
58
- modalCloseBtn.addEventListener("click", testimonialsModalFunc);
59
- overlay.addEventListener("click", testimonialsModalFunc);
60
-
61
-
62
-
63
- // custom select variables
64
- const select = document.querySelector("[data-select]");
65
- const selectItems = document.querySelectorAll("[data-select-item]");
66
- const selectValue = document.querySelector("[data-selecct-value]");
67
- const filterBtn = document.querySelectorAll("[data-filter-btn]");
68
-
69
- select.addEventListener("click", function() { elementToggleFunc(this); });
70
-
71
- // add event in all select items
72
- document.getElementById("LazyImages").onloadedmetadata = () => {
73
- for (let i = 0; i < selectItems.length; i++) {
74
- selectItems[i].addEventListener("click", function() {
75
-
76
- let selectedValue = this.innerText.toLowerCase();
77
- selectValue.innerText = this.innerText;
78
- elementToggleFunc(select);
79
- filterFunc(selectedValue);
80
-
81
- });
82
- }
83
- }
84
-
85
- // filter variables
86
-
87
-
88
- const filterFunc = function(selectedValue) {
89
- const filterItems = document.querySelectorAll("[data-filter-item]");
90
- for (let i = 0; i < filterItems.length; i++) {
91
-
92
- if (selectedValue === "all") {
93
- filterItems[i].classList.add("active");
94
- } else if (filterItems[i].dataset.category.includes(selectedValue)) {
95
- filterItems[i].classList.add("active");
96
- } else {
97
- filterItems[i].classList.remove("active");
98
- }
99
-
100
- }
101
-
102
- }
103
-
104
- // add event in all filter button items for large screen
105
- let lastClickedBtn = filterBtn[0];
106
-
107
- for (let i = 0; i < filterBtn.length; i++) {
108
-
109
- filterBtn[i].addEventListener("click", function() {
110
-
111
- let selectedValue = this.innerText.toLowerCase();
112
- selectValue.innerText = this.innerText;
113
- filterFunc(selectedValue);
114
-
115
- lastClickedBtn.classList.remove("active");
116
- this.classList.add("active");
117
- lastClickedBtn = this;
118
-
119
- });
120
-
121
- }
122
-
123
-
124
-
125
- // contact form variables
126
- const form = document.querySelector("[data-form]");
127
- const formInputs = document.querySelectorAll("[data-form-input]");
128
- const formBtn = document.querySelector("[data-form-btn]");
129
-
130
- // add event to all form input field
131
- for (let i = 0; i < formInputs.length; i++) {
132
- formInputs[i].addEventListener("input", function() {
133
-
134
- // check form validation
135
- if (form.checkValidity()) {
136
- formBtn.removeAttribute("disabled");
137
- } else {
138
- formBtn.setAttribute("disabled", "");
139
- }
140
-
141
- });
142
- }
143
-
144
-
145
-
146
- // page navigation variables
147
- const navigationLinks = document.querySelectorAll("[data-nav-link]");
148
- const pages = document.querySelectorAll("[data-page]");
149
-
150
- // add event to all nav link
151
- for (let i = 0; i < navigationLinks.length; i++) {
152
- navigationLinks[i].addEventListener("click", function() {
153
-
154
- for (let i = 0; i < pages.length; i++) {
155
- if (this.innerHTML.toLowerCase() === pages[i].dataset.page) {
156
- pages[i].classList.add("active");
157
- navigationLinks[i].classList.add("active");
158
- window.scrollTo(0, 0);
159
- } else {
160
- pages[i].classList.remove("active");
161
- navigationLinks[i].classList.remove("active");
162
- }
163
- }
164
-
165
- });
166
  }
 
1
+ 'use strict';
2
+
3
+
4
+
5
+
6
+
7
+
8
+ // element toggle function
9
+ const elementToggleFunc = function(elem) { elem.classList.toggle("active"); }
10
+
11
+
12
+
13
+ // sidebar variables
14
+ const sidebar = document.querySelector("[data-sidebar]");
15
+ const sidebarBtn = document.querySelector("[data-sidebar-btn]");
16
+
17
+ // sidebar toggle functionality for mobile
18
+ sidebarBtn.addEventListener("click", function() { elementToggleFunc(sidebar); });
19
+
20
+
21
+
22
+ // testimonials variables
23
+ const testimonialsItem = document.querySelectorAll("[data-testimonials-item]");
24
+ const modalContainer = document.querySelector("[data-modal-container]");
25
+ const modalCloseBtn = document.querySelector("[data-modal-close-btn]");
26
+ const overlay = document.querySelector("[data-overlay]");
27
+
28
+ // modal variable
29
+ const modalImg = document.querySelector("[data-modal-img]");
30
+ const modalTitle = document.querySelector("[data-modal-title]");
31
+ const modalText = document.querySelector("[data-modal-text]");
32
+
33
+ // modal toggle function
34
+ const testimonialsModalFunc = function() {
35
+ modalContainer.classList.toggle("active");
36
+ overlay.classList.toggle("active");
37
+ }
38
+
39
+
40
+ // add click event to all modal items
41
+ for (let i = 0; i < testimonialsItem.length; i++) {
42
+
43
+ testimonialsItem[i].addEventListener("click", function() {
44
+
45
+ modalImg.src = this.querySelector("[data-testimonials-avatar]").src;
46
+ modalImg.alt = this.querySelector("[data-testimonials-avatar]").alt;
47
+ modalTitle.innerHTML = this.querySelector("[data-testimonials-title]").innerHTML;
48
+ modalText.innerHTML = this.querySelector("[data-testimonials-text]").innerHTML;
49
+
50
+ testimonialsModalFunc();
51
+
52
+ });
53
+
54
+ }
55
+
56
+
57
+ // add click event to modal close button
58
+ modalCloseBtn.addEventListener("click", testimonialsModalFunc);
59
+ overlay.addEventListener("click", testimonialsModalFunc);
60
+
61
+
62
+
63
+ // custom select variables
64
+ const select = document.querySelector("[data-select]");
65
+ const selectItems = document.querySelectorAll("[data-select-item]");
66
+ const selectValue = document.querySelector("[data-selecct-value]");
67
+ const filterBtn = document.querySelectorAll("[data-filter-btn]");
68
+
69
+ select.addEventListener("click", function() { elementToggleFunc(this); });
70
+
71
+ // add event in all select items
72
+ document.getElementById("LazyImages").onloadedmetadata = () => {
73
+ for (let i = 0; i < selectItems.length; i++) {
74
+ selectItems[i].addEventListener("click", function() {
75
+
76
+ let selectedValue = this.innerText.toLowerCase();
77
+ selectValue.innerText = this.innerText;
78
+ elementToggleFunc(select);
79
+ filterFunc(selectedValue);
80
+
81
+ });
82
+ }
83
+ }
84
+
85
+ // filter variables
86
+
87
+
88
+ const filterFunc = function(selectedValue) {
89
+ const filterItems = document.querySelectorAll("[data-filter-item]");
90
+ for (let i = 0; i < filterItems.length; i++) {
91
+
92
+ if (selectedValue === "all") {
93
+ filterItems[i].classList.add("active");
94
+ } else if (filterItems[i].dataset.category.includes(selectedValue)) {
95
+ filterItems[i].classList.add("active");
96
+ } else {
97
+ filterItems[i].classList.remove("active");
98
+ }
99
+
100
+ }
101
+
102
+ }
103
+
104
+ // add event in all filter button items for large screen
105
+ let lastClickedBtn = filterBtn[0];
106
+
107
+ for (let i = 0; i < filterBtn.length; i++) {
108
+
109
+ filterBtn[i].addEventListener("click", function() {
110
+
111
+ let selectedValue = this.innerText.toLowerCase();
112
+ selectValue.innerText = this.innerText;
113
+ filterFunc(selectedValue);
114
+
115
+ lastClickedBtn.classList.remove("active");
116
+ this.classList.add("active");
117
+ lastClickedBtn = this;
118
+
119
+ });
120
+
121
+ }
122
+
123
+
124
+
125
+ // contact form variables
126
+ const form = document.querySelector("[data-form]");
127
+ const formInputs = document.querySelectorAll("[data-form-input]");
128
+ const formBtn = document.querySelector("[data-form-btn]");
129
+
130
+ // add event to all form input field
131
+ for (let i = 0; i < formInputs.length; i++) {
132
+ formInputs[i].addEventListener("input", function() {
133
+
134
+ // check form validation
135
+ if (form.checkValidity()) {
136
+ formBtn.removeAttribute("disabled");
137
+ } else {
138
+ formBtn.setAttribute("disabled", "");
139
+ }
140
+
141
+ });
142
+ }
143
+
144
+
145
+
146
+ // page navigation variables
147
+ const navigationLinks = document.querySelectorAll("[data-nav-link]");
148
+ const pages = document.querySelectorAll("[data-page]");
149
+
150
+ // add event to all nav link
151
+ for (let i = 0; i < navigationLinks.length; i++) {
152
+ navigationLinks[i].addEventListener("click", function() {
153
+
154
+ for (let i = 0; i < pages.length; i++) {
155
+ if (this.innerHTML.toLowerCase() === pages[i].dataset.page) {
156
+ pages[i].classList.add("active");
157
+ navigationLinks[i].classList.add("active");
158
+ window.scrollTo(0, 0);
159
+ } else {
160
+ pages[i].classList.remove("active");
161
+ navigationLinks[i].classList.remove("active");
162
+ }
163
+ }
164
+
165
+ });
166
  }
data/Certificates.json CHANGED
@@ -1,20 +1,43 @@
1
  [{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  "title": "Excle From A To Z",
3
  "category": "Dashbord",
4
  "Time": "Jan 11, 2026",
5
  "image": "./assets/Certifcations/Excle.jpg",
6
- "details": "./CirtifiCationsViewr/CertificatesViewer.html?data=data/C1.json",
7
  "Text": " Learning Excle Commands & Dashbord "
8
  },
 
 
 
 
 
 
 
 
9
  {
10
  "title": "Tech For Non-Tech",
11
  "category": "AI Models",
12
  "Time": "Dec 30, 2025",
13
  "image": "./assets/Certifcations/Mohammed.jpg",
14
- "details": "./CirtifiCationsViewr/CertificatesViewer.html?data=data/C1.json",
15
  "Text": " Studing Google WorkSpace ,PowerBI & Automation"
16
  }
17
 
18
 
19
-
20
  ]
 
1
  [{
2
+ "title": "AI :12 Month Learning Journey ",
3
+ "category": "AI Models",
4
+ "Time": "Fef 19, 2026",
5
+ "image": "./assets/Certifcations/AI.jpg",
6
+ "details": "./CirtifiCationsViewr/CertificatesViewer.html?data=data/C1.json",
7
+ "Text": " Studing ALL about AI , ML,DL,CV and NLP "
8
+ },
9
+ {
10
+ "title": "SQL Server Development",
11
+
12
+ "Time": "Feb 7, 2026",
13
+ "image": "./assets/Certifcations/SQL.png",
14
+ "details": "./CirtifiCationsViewr/CertificatesViewer.html?data=data/C2.json",
15
+ "Text": " Learning Database Design Using ERD and EERD and Developing using TSQL "
16
+ },
17
+ {
18
  "title": "Excle From A To Z",
19
  "category": "Dashbord",
20
  "Time": "Jan 11, 2026",
21
  "image": "./assets/Certifcations/Excle.jpg",
22
+ "details": "./CirtifiCationsViewr/CertificatesViewer.html?data=data/C3.json",
23
  "Text": " Learning Excle Commands & Dashbord "
24
  },
25
+ {
26
+ "title": "Ubuntu Linux Essentials",
27
+ "category": "AI Models",
28
+ "Time": "Jan 24, 2026",
29
+ "image": "./assets/Certifcations/Ubunto.jpg",
30
+ "details": "./CirtifiCationsViewr/CertificatesViewer.html?data=data/C4.json",
31
+ "Text": " Studing Ubuntu Essentials and Deferent typs of Shell"
32
+ },
33
  {
34
  "title": "Tech For Non-Tech",
35
  "category": "AI Models",
36
  "Time": "Dec 30, 2025",
37
  "image": "./assets/Certifcations/Mohammed.jpg",
38
+ "details": "./CirtifiCationsViewr/CertificatesViewer.html?data=data/C5.json",
39
  "Text": " Studing Google WorkSpace ,PowerBI & Automation"
40
  }
41
 
42
 
 
43
  ]
data/projects.json CHANGED
@@ -14,7 +14,37 @@
14
  "details": "./ProjectViewr/ProjectViewr.html?data=data/Pro3.json"
15
  }
16
 
17
- ,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
 
19
  {
20
  "title": "Users FullStack Reactjs App",
 
14
  "details": "./ProjectViewr/ProjectViewr.html?data=data/Pro3.json"
15
  }
16
 
17
+ , {
18
+ "title": "Sales Analysis DashBord |Tableau",
19
+ "category": "Dashbord",
20
+ "filter": "dashbords ",
21
+ "image": "./assets/images/Projects/Tableau Pro2.png",
22
+ "details": "./ProjectViewr/ProjectViewr.html?data=data/Pro5.json"
23
+ }, {
24
+ "title": "Airline Performance & Analytics Dashboard",
25
+ "category": "Dashbord",
26
+ "filter": "dashbords ",
27
+ "image": "./ProjectViewr/assets/im4.png",
28
+ "details": "./ProjectViewr/ProjectViewr.html?data=data/Pro6.json"
29
+ }, {
30
+ "title": "Adventure Works Sales Performance Analysis",
31
+ "category": "Dashbord",
32
+ "filter": "dashbords ",
33
+ "image": "./ProjectViewr/assets/overview.png",
34
+ "details": "./ProjectViewr/ProjectViewr.html?data=data/Pro9.json"
35
+ }, {
36
+ "title": "Airline Performance & Analytics Dashboard",
37
+ "category": "Dashbord",
38
+ "filter": "dashbords ",
39
+ "image": "./ProjectViewr/assets/ks.png",
40
+ "details": "./ProjectViewr/ProjectViewr.html?data=data/Pro7.json"
41
+ }, {
42
+ "title": "Adventure Works Cycles: Sales Performance Dashboard",
43
+ "category": "Dashbord",
44
+ "filter": "dashbords ",
45
+ "image": "./ProjectViewr/assets/adv2.png",
46
+ "details": "./ProjectViewr/ProjectViewr.html?data=data/Pro8.json"
47
+ },
48
 
49
  {
50
  "title": "Users FullStack Reactjs App",
index.html CHANGED
@@ -1,890 +1,900 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
-
4
- <head>
5
- <meta charset="UTF-8">
6
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
7
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
8
- <title>Personal Portfolio</title>
9
-
10
- <!--
11
- - favicon
12
- -->
13
- <link rel="shortcut icon" href="./assets/images/logo.ico" type="image/x-icon">
14
-
15
- <!--
16
- - custom css link
17
- -->
18
- <link rel="stylesheet" href="./assets/css/style.css">
19
-
20
- <!--
21
- - google font link
22
- -->
23
- <link rel="preconnect" href="https://fonts.googleapis.com">
24
- <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
25
- <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600&display=swap" rel="stylesheet">
26
- </head>
27
-
28
- <body>
29
-
30
- <!--
31
- - #MAIN
32
- -->
33
-
34
- <main>
35
-
36
- <!--
37
- - #SIDEBAR
38
- -->
39
-
40
- <aside class="sidebar" data-sidebar>
41
-
42
- <div class="sidebar-info">
43
-
44
- <figure class="avatar-box" style=" border-radius: 50px;">
45
- <img src="./assets/images/MyImage.jpg" alt="Richard hanrick" width="80" style=" border-radius: 20px;" >
46
- </figure>
47
-
48
- <div class="info-content">
49
- <h1 class="name" title="Richard hanrick">Mohammed Abo Ellil</h1>
50
-
51
- <p class="title">Data Scientist</p>
52
- </div>
53
-
54
- <button class="info_more-btn" data-sidebar-btn>
55
- <span>Show Contacts</span>
56
-
57
- <ion-icon name="chevron-down"></ion-icon>
58
- </button>
59
-
60
- </div>
61
-
62
- <div class="sidebar-info_more">
63
-
64
- <div class="separator"></div>
65
-
66
- <ul class="contacts-list">
67
-
68
- <li class="contact-item">
69
-
70
- <div class="icon-box">
71
- <ion-icon name="mail-outline"></ion-icon>
72
- </div>
73
-
74
- <div class="contact-info">
75
- <p class="contact-title">Email</p>
76
-
77
- <a href="mailto:mohammedaboellil200@gmail.com" class="contact-link">mohammedaboellil200@gmail.com</a>
78
- </div>
79
-
80
- </li>
81
-
82
- <li class="contact-item">
83
-
84
- <div class="icon-box">
85
- <ion-icon name="phone-portrait-outline"></ion-icon>
86
- </div>
87
-
88
- <div class="contact-info">
89
- <p class="contact-title">Phone</p>
90
-
91
- <a href="tel:+201036689958" class="contact-link">+20 (103) 6689-958</a>
92
- </div>
93
-
94
- </li>
95
-
96
- <li class="contact-item">
97
-
98
- <div class="icon-box">
99
- <ion-icon name="calendar-outline"></ion-icon>
100
- </div>
101
-
102
- <div class="contact-info">
103
- <p class="contact-title">Birthday</p>
104
-
105
- <time datetime="2001-04-229">April 29, 2001</time>
106
- </div>
107
-
108
- </li>
109
-
110
- <li class="contact-item">
111
-
112
- <div class="icon-box">
113
- <ion-icon name="location-outline"></ion-icon>
114
- </div>
115
-
116
- <div class="contact-info">
117
- <p class="contact-title">Location</p>
118
-
119
- <address>Tanta, Ghabia, EGYPT</address>
120
- </div>
121
-
122
- </li>
123
-
124
- </ul>
125
-
126
- <div class="separator"></div>
127
-
128
- <ul class="social-list">
129
-
130
- <li class="social-item">
131
- <a href="https://www.facebook.com/profile.php?id=61585737173252" class="social-link">
132
- <ion-icon name="logo-facebook"></ion-icon>
133
- </a>
134
- </li>
135
-
136
- <li class="social-item">
137
- <a href="https://www.linkedin.com/in/mohammed-aboellil-7806a5245/" class="social-link">
138
- <ion-icon name="logo-linkedin"></ion-icon>
139
- </a>
140
- </li>
141
-
142
- <li class="social-item">
143
- <a href="#" class="social-link">
144
- <ion-icon name="logo-kaggle"></ion-icon>
145
- </a>
146
- </li>
147
-
148
- </ul>
149
-
150
- </div>
151
-
152
- </aside>
153
-
154
-
155
-
156
-
157
-
158
- <!--
159
- - #main-content
160
- -->
161
-
162
- <div class="main-content">
163
-
164
- <!--
165
- - #NAVBAR
166
- -->
167
-
168
- <nav class="navbar">
169
-
170
- <ul class="navbar-list">
171
-
172
- <li class="navbar-item">
173
- <button class="navbar-link active" data-nav-link>About</button>
174
- </li>
175
-
176
- <li class="navbar-item">
177
- <button class="navbar-link" data-nav-link>Resume</button>
178
- </li>
179
-
180
- <li class="navbar-item">
181
- <button class="navbar-link" data-nav-link>Portfolio</button>
182
- </li>
183
-
184
- <li class="navbar-item">
185
- <button class="navbar-link" data-nav-link>Certifications</button>
186
- </li>
187
-
188
-
189
-
190
- </ul>
191
-
192
- </nav>
193
-
194
-
195
-
196
-
197
-
198
- <!--
199
- - #ABOUT
200
- -->
201
-
202
- <article class="about active" data-page="about">
203
-
204
- <header>
205
- <h2 class="h2 article-title">About me</h2>
206
- </header>
207
-
208
- <section class="about-text">
209
- <p>
210
- I am a Data science engineer skilled in Python, SQL, and machine learning frameworks. Experienced in
211
- projects such as face recognition, indoor localization, and wake word detection, achieving measurable
212
- improvements like 10% accuracy gains on small datasets. Seeking to apply expertise to analyze data,
213
- build predictive models, and deploy AI solutions that deliver measurable impact.
214
- </p>
215
-
216
- <p>
217
- I build end-to-end machine learning solutions, from data preprocessing and model development to deployment using modern frameworks. My work emphasizes accuracy, efficiency, and real-time performance, ensuring that AI systems are practical, scalable, and aligned with business needs.
218
- </p>
219
- </section>
220
-
221
-
222
- <!--
223
- - service
224
- -->
225
-
226
- <section class="service">
227
-
228
- <h3 class="h3 service-title">What i'm doing</h3>
229
-
230
- <ul class="service-list">
231
-
232
- <li class="service-item">
233
-
234
- <div class="service-icon-box">
235
- <img src="./assets/images/robot.png
236
- " alt="design icon" width="40">
237
- </div>
238
-
239
- <div class="service-content-box">
240
- <h4 class="h4 service-item-title">Machine Learning & AI</h4>
241
-
242
- <p class="service-item-text">
243
- Designing and training machine learning models to solve real-world problems, with a focus on accuracy, efficiency, and practical deployment.
244
- </p>
245
- </div>
246
-
247
- </li>
248
-
249
- <li class="service-item">
250
-
251
- <div class="service-icon-box">
252
- <img src="./assets/images/eye.png" alt="Web development icon" width="40">
253
- </div>
254
-
255
- <div class="service-content-box">
256
- <h4 class="h4 service-item-title">Computer Vision</h4>
257
-
258
- <p class="service-item-text">
259
- Building computer vision systems such as face recognition and wake-word detection using deep learning models optimized for real-time and mobile environments.
260
- </p>
261
- </div>
262
-
263
- </li>
264
-
265
- <li class="service-item">
266
-
267
- <div class="service-icon-box">
268
- <img src="./assets/images/map.png" alt="mobile app icon" width="40">
269
- </div>
270
-
271
- <div class="service-content-box">
272
- <h4 class="h4 service-item-title">Indoor Localization & Mapping</h4>
273
-
274
- <p class="service-item-text">
275
- Developing WiFi-based indoor localization systems and navigation solutions using deep learning and pathfinding algorithms for accurate indoor positioning.
276
- </p>
277
- </div>
278
-
279
- </li>
280
-
281
- <li class="service-item">
282
-
283
- <div class="service-icon-box">
284
- <img src="./assets/images/project-launch.png" alt="camera icon" width="40">
285
- </div>
286
-
287
- <div class="service-content-box">
288
- <h4 class="h4 service-item-title">Model Deployment & APIs</h4>
289
-
290
- <p class="service-item-text">
291
- Deploying machine learning models as scalable REST APIs using FastAPI, ONNX Runtime,TFLite, and cloud-ready architectures.
292
- </p>
293
- </div>
294
-
295
- </li>
296
-
297
-
298
- <li class="service-item">
299
-
300
- <div class="service-icon-box">
301
- <img src="./assets/images/software-application.png" alt="camera icon" width="40">
302
- </div>
303
-
304
- <div class="service-content-box">
305
- <h4 class="h4 service-item-title">AI-Powered Web Applications</h4>
306
-
307
- <p class="service-item-text">
308
- Integrating AI models into modern web applications using FastAPI and React to create intelligent, user-friendly systems.
309
- </p>
310
- </div>
311
-
312
- </li>
313
-
314
- <li class="service-item">
315
-
316
- <div class="service-icon-box">
317
- <img src="./assets/images/automation.png" alt="camera icon" width="40">
318
- </div>
319
-
320
- <div class="service-content-box">
321
- <h4 class="h4 service-item-title">Automation & Workflows</h4>
322
-
323
- <p class="service-item-text">
324
- Automating data pipelines and AI workflows using n8n to connect models, APIs, and external services efficiently.
325
- </p>
326
- </div>
327
-
328
- </li>
329
-
330
- </ul>
331
-
332
- </section>
333
-
334
-
335
- <!--
336
- - testimonials
337
- -->
338
-
339
- <section class="testimonials">
340
-
341
- <h3 class="h3 testimonials-title">Technical Stack & Tools</h3>
342
-
343
- <ul class="testimonials-list has-scrollbar">
344
-
345
- <li class="testimonials-item">
346
- <div class="content-card" data-testimonials-item>
347
-
348
- <figure class="testimonials-avatar-box">
349
- <img src="./assets/images/Python.png" alt="Daniel lewis" width="60" data-testimonials-avatar>
350
- </figure>
351
-
352
- <h4 class="h4 testimonials-item-title" data-testimonials-title>Programing Languages</h4>
353
- <div class="testimonials-text" data-testimonials-text>
354
- <p >
355
- Python has been my go‑to for turning raw data into intelligent solutions, from machine learning models to real‑time systems. With libraries like NumPy, Pandas, TensorFlow, and PyTorch, I’ve built and deployed AI pipelines using FastAPI, ONNX, and TFLite.
356
- <br>
357
- JavaScript has been my bridge to building interactive web experiences, especially through React. At an intermediate level, I’ve used it to create dynamic interfaces and connect AI‑powered backends with responsive, real‑time applications.
358
- </p>
359
- </div>
360
-
361
- </div>
362
- </li>
363
-
364
- <li class="testimonials-item">
365
- <div class="content-card" data-testimonials-item>
366
-
367
- <figure class="testimonials-avatar-box">
368
- <img src="./assets/images/tf.svg" alt="Jessica miller" width="60" data-testimonials-avatar>
369
- </figure>
370
-
371
- <h4 class="h4 testimonials-item-title" data-testimonials-title>AI Frame Work</h4>
372
- <div class="testimonials-text" data-testimonials-text>
373
- <p>
374
- My journey with AI frameworks began when Python became a tool for building intelligent systems, using Scikit-learn and TensorFlow to solve real problems.
375
- I deploy these models into production by optimizing them with ONNX and TFLite and serving them through FastAPI for fast, scalable AI solutions.
376
- </p>
377
- </div>
378
-
379
- </div>
380
- </li>
381
-
382
- <li class="testimonials-item">
383
- <div class="content-card" data-testimonials-item>
384
-
385
- <figure class="testimonials-avatar-box">
386
- <img src="./assets/images/fastapi.svg" alt="Emily evans" width="60" data-testimonials-avatar>
387
- </figure>
388
-
389
- <h4 class="h4 testimonials-item-title" data-testimonials-title>AI Deployment</h4>
390
- <div class="testimonials-text" data-testimonials-text>
391
- <p>
392
- FastAPI is where my AI models become real products — I use it to turn trained models into scalable, high-performance APIs that can be reliably consumed by web and mobile applications.
393
- <br>Through FastAPI, I focus on clean architecture, low-latency inference, and seamless integration between AI backends and real-world systems.
394
- </p>
395
- </div>
396
-
397
- </div>
398
- </li>
399
-
400
- <li class="testimonials-item">
401
- <div class="content-card" data-testimonials-item>
402
-
403
- <figure class="testimonials-avatar-box">
404
- <img src="./assets/images/n8n-color.svg" alt="Henry william" width="60" data-testimonials-avatar style="padding:10px;">
405
- </figure>
406
-
407
- <h4 class="h4 testimonials-item-title" data-testimonials-title>Automation</h4>
408
- <div class="testimonials-text" data-testimonials-text>
409
- <p>
410
- I use n8n to automate AI workflows and system integrations, turning repetitive processes into reliable, event-driven pipelines.
411
- Through automation, I connect models, APIs, and data sources to create end-to-end solutions that run efficiently with minimal manual intervention.
412
- </p>
413
- </div>
414
-
415
- </div>
416
- </li>
417
-
418
- </ul>
419
-
420
- </section>
421
-
422
-
423
- <!--
424
- - testimonials modal
425
- -->
426
-
427
- <div class="modal-container" data-modal-container>
428
-
429
- <div class="overlay" data-overlay></div>
430
-
431
- <section class="testimonials-modal">
432
-
433
- <button class="modal-close-btn" data-modal-close-btn>
434
- <ion-icon name="close-outline"></ion-icon>
435
- </button>
436
-
437
- <div class="modal-img-wrapper">
438
- <figure class="modal-avatar-box">
439
- <img src="./assets/images/avatar-1.png" alt="Daniel lewis" width="80" data-modal-img>
440
- </figure>
441
-
442
- <img src="./assets/images/icon-quote.svg" alt="quote icon">
443
- </div>
444
-
445
- <div class="modal-content" >
446
-
447
- <h4 class="h3 modal-title" data-modal-title>Daniel lewis</h4>
448
-
449
- <time datetime="2021-06-14" data-modal-Time>14 June, 2021</time>
450
-
451
- <div data-modal-text style='color:"fff"'>
452
- <p>
453
- Richard was hired to create a corporate identity. We were very pleased with the work done. She has a
454
- lot of experience
455
- and is very concerned about the needs of client. Lorem ipsum dolor sit amet, ullamcous cididt
456
- consectetur adipiscing
457
- elit, seds do et eiusmod tempor incididunt ut laborels dolore magnarels alia.
458
- </p>
459
- </div>
460
-
461
- </div>
462
-
463
- </section>
464
-
465
- </div>
466
-
467
-
468
- <!--
469
- - clients
470
- -->
471
-
472
- <section class="clients">
473
-
474
- <h3 class="h3 clients-title">Internships</h3>
475
-
476
- <ul class="clients-list has-scrollbar">
477
-
478
- <li class="clients-item">
479
- <a href="https://iti.gov.eg/">
480
- <img src="./assets/images/iti-logo-422x430.png" alt="client logo" >
481
- </a>
482
- </li>
483
-
484
- <li class="clients-item">
485
- <a href="https://maharatech.gov.eg/">
486
- <img src="./assets/images/mahara.png" alt="client logo">
487
- </a>
488
- </li>
489
-
490
- <li class="clients-item">
491
- <a href="https://icareer.ai/">
492
- <img src="./assets/images/icareeregy_logo.png" alt="client logo">
493
- </a>
494
- </li>
495
-
496
- <li class="clients-item">
497
- <a href="https://www.linkedin.com/company/apps-square/?originalSubdomain=eg">
498
- <img src="./assets/images/appsq-.png" alt="client logo">
499
- </a>
500
- </li>
501
-
502
-
503
- </ul>
504
-
505
- </section>
506
-
507
- </article>
508
-
509
-
510
-
511
-
512
-
513
- <!--
514
- - #RESUME
515
- -->
516
-
517
- <article class="resume" data-page="resume">
518
-
519
- <header>
520
- <h2 class="h2 article-title">Resume</h2>
521
- </header>
522
-
523
- <section class="timeline">
524
-
525
- <div class="title-wrapper">
526
- <div class="icon-box">
527
- <ion-icon name="book-outline"></ion-icon>
528
- </div>
529
-
530
- <h3 class="h3">Education</h3>
531
- </div>
532
-
533
- <ol class="timeline-list">
534
-
535
- <li class="timeline-item">
536
-
537
- <h4 class="h4 timeline-item-title">Information Technology Institute ITI</h4>
538
-
539
- <span>1/2026 — 6/2026</span>
540
-
541
- <p class="timeline-text">
542
- I transform raw data into actionable insights, creating interactive dashboards and reports that empower organizations to make data-driven decisions efficiently and effectively.
543
- </p>
544
-
545
- </li>
546
-
547
- <li class="timeline-item">
548
-
549
- <h4 class="h4 timeline-item-title"> B.Sc. in Electrical Engineering (Computing and Automatic Control)</h4>
550
-
551
- <span>2019 — 2024</span>
552
-
553
- <p class="timeline-text">
554
- As a Data Science enthusiast with a background in Electrical Engineering (Computing and Automatic Control), I transform complex data into actionable insights, building interactive dashboards and predictive models that support smarter, data-driven business decisions
555
- </p>
556
-
557
- </li>
558
-
559
- </ol>
560
-
561
- </section>
562
-
563
- <section class="skill">
564
-
565
- <h3 class="h3 skills-title">My skills</h3>
566
-
567
- <ul class="skills-list content-card">
568
-
569
- <li class="skills-item">
570
-
571
- <div class="title-wrapper">
572
- <h5 class="h5">Programming: Python (Advanced), JavaScript
573
- (Intermediate)
574
- </h5>
575
- <!-- <data value="80">80%</data>-->
576
- </div>
577
-
578
- </li>
579
-
580
- <li class="skills-item">
581
-
582
- <div class="title-wrapper">
583
- <h5 class="h5">Data Processing : Pandas , NumPy , Statistics</h5>
584
-
585
- </div>
586
-
587
- </li>
588
-
589
- <li class="skills-item">
590
-
591
- <div class="title-wrapper">
592
- <h5 class="h5">Data Visualization : Power BI , Excel ,Tableau</h5>
593
- <data value="90"></data>
594
- </div>
595
-
596
- <!--<div class="skill-progress-bg">
597
- <div class="skill-progress-fill" style="width: 90%;"></div>
598
- </div>-->
599
-
600
- </li>
601
-
602
- <li class="skills-item">
603
-
604
- <div class="title-wrapper">
605
- <h5 class="h5">Data Science: Scikit‑learn, TensorFlow</h5>
606
- <data value="50"></data>
607
- </div>
608
-
609
- <!--<div class="skill-progress-bg">
610
- <div class="skill-progress-fill" style="width: 50%;"></div>
611
- </div>-->
612
-
613
- </li>
614
-
615
- <li class="skills-item">
616
-
617
- <div class="title-wrapper">
618
- <h5 class="h5">Web Development: FastAPI, React.js
619
- </h5>
620
- <data value="50"></data>
621
- </div>
622
-
623
- <!--<div class="skill-progress-bg">
624
- <div class="skill-progress-fill" style="width: 50%;"></div>
625
- </div>-->
626
-
627
- </li>
628
-
629
- <li class="skills-item">
630
-
631
- <div class="title-wrapper">
632
- <h5 class="h5">Automation: n8n</h5>
633
- <data value="50"></data>
634
- </div>
635
-
636
- <!--<div class="skill-progress-bg">
637
- <div class="skill-progress-fill" style="width: 50%;"></div>
638
- </div>-->
639
-
640
- </li>
641
-
642
-
643
-
644
-
645
-
646
-
647
-
648
- </ul>
649
-
650
- </section>
651
-
652
- </article>
653
-
654
-
655
-
656
-
657
-
658
- <!--
659
- - #PORTFOLIO
660
- -->
661
-
662
- <article class="portfolio" data-page="portfolio">
663
-
664
- <header>
665
- <h2 class="h2 article-title">Portfolio</h2>
666
- </header>
667
-
668
- <section class="projects">
669
-
670
- <ul class="filter-list">
671
-
672
- <li class="filter-item">
673
- <button class="active" data-filter-btn>All</button>
674
- </li>
675
-
676
- <li class="filter-item">
677
- <button data-filter-btn>AI models</button>
678
- </li>
679
-
680
- <li class="filter-item">
681
- <button data-filter-btn>Dashbords</button>
682
- </li>
683
-
684
- <li class="filter-item">
685
- <button data-filter-btn>Automation</button>
686
- </li>
687
- <li class="filter-item">
688
- <button data-filter-btn>FullStack</button>
689
- </li>
690
-
691
- </ul>
692
-
693
- <div class="filter-select-box">
694
-
695
- <button class="filter-select" data-select>
696
-
697
- <div class="select-value" data-selecct-value>Select category</div>
698
-
699
- <div class="select-icon">
700
- <ion-icon name="chevron-down"></ion-icon>
701
- </div>
702
-
703
- </button>
704
-
705
- <ul class="select-list">
706
-
707
- <li class="select-item">
708
- <button data-select-item>All</button>
709
- </li>
710
-
711
- <li class="select-item">
712
- <button data-select-item>AI Models</button>
713
- </li>
714
-
715
- <li class="select-item">
716
- <button data-select-item>Dashbords</button>
717
- </li>
718
-
719
- <li class="select-item">
720
- <button data-select-item>Automation</button>
721
- </li>
722
-
723
- <li class="select-item">
724
- <button data-select-item>FullStack</button>
725
- </li>
726
-
727
- </ul>
728
-
729
- </div>
730
-
731
- <ul class="project-list" id="projectList">
732
- <li class="project-item active" data-filter-item="" data-category="ai models">
733
- <a href="./ProjectViewr/ProjectViewr.html?data=data/Pro2.json" target="_blank">
734
- <figure class="project-img">
735
- <div class="project-item-icon-box">
736
- <ion-icon name="eye-outline" role="img" class="md hydrated" aria-label="eye outline"></ion-icon>
737
- </div>
738
- <img src="./assets/ProImg/FaceRec.png" alt="Face Recognition" loading="lazy" id="LazyImages">
739
- </figure>
740
-
741
- <h3 class="project-title">Face Recognition</h3>
742
- <p class="project-category">AI Models</p>
743
- </a>
744
- </li>
745
-
746
- </ul>
747
-
748
- </section>
749
-
750
- </article>
751
-
752
-
753
-
754
-
755
-
756
- <!--
757
- - #BLOG
758
- -->
759
-
760
- <article class="blog" data-page="certifications">
761
-
762
- <header>
763
- <h2 class="h2 article-title">Certificates</h2>
764
- </header>
765
-
766
- <section class="blog-posts">
767
-
768
- <ul class="blog-posts-list" id ="Certificates">
769
-
770
- </ul>
771
-
772
- </section>
773
-
774
- </article>
775
-
776
-
777
-
778
-
779
-
780
-
781
- </div>
782
-
783
- </main>
784
-
785
-
786
- <script>
787
-
788
- fetch('./data/projects.json')
789
- .then(response => response.json())
790
- .then(projects => {
791
- const projectList = document.getElementById('projectList');
792
-
793
-
794
- projects.forEach(project => {
795
- const li = document.createElement('li');
796
- li.className = 'project-item active';
797
- li.setAttribute('data-filter-item', '');
798
- li.setAttribute('data-category', project.filter);
799
-
800
-
801
- li.innerHTML = `
802
- <a href="${project.details}" target="_blank">
803
- <figure class="project-img">
804
- <div class="project-item-icon-box">
805
- <ion-icon name="eye-outline"></ion-icon>
806
- </div>
807
- <img src="${project.image}" style:"background-url:" alt="${project.title}" loading="lazy">
808
- </figure>
809
-
810
- <h3 class="project-title">${project.title}</h3>
811
- <p class="project-category">${project.category}</p>
812
- </a>
813
- `;
814
-
815
- projectList.appendChild(li);
816
- });
817
- })
818
- .catch(error => console.error('Error loading projects:', error));
819
-
820
- </script>
821
-
822
-
823
- <script>
824
- fetch('./data/Certificates.json')
825
- .then(response => response.json())
826
- .then(Certificates => {
827
- const CertificateList = document.getElementById('Certificates');
828
-
829
-
830
- Certificates.forEach(Certificate => {
831
- const li = document.createElement('li');
832
- li.className = "blog-post-item";
833
-
834
-
835
- li.innerHTML = `
836
- <a href="${Certificate.details}" target='_blank'>
837
-
838
- <figure class="blog-banner-box" >
839
- <img src="${Certificate.image}" alt="Image" loading="lazy">
840
- </figure>
841
-
842
- <div class="blog-content">
843
-
844
- <div class="blog-meta">
845
- <p class="blog-category">Certificate.category</p>
846
-
847
- <span class="dot"></span>
848
-
849
- <time datetime="2022-02-23">${Certificate.Time}</time>
850
- </div><h3 class="h3 blog-item-title">${Certificate.title}</h3>
851
-
852
- <p class="blog-text" >
853
- ${Certificate.Text}
854
- </p>
855
-
856
- </div>
857
-
858
- </a>
859
-
860
- `;
861
-
862
- CertificateList.appendChild(li);
863
- });
864
- })
865
- .catch(error => console.error('Error loading projects:', error));
866
- </script>
867
-
868
-
869
-
870
-
871
- <!--
872
- - custom js link
873
- -->
874
- <script src="./assets/js/script.js"></script>
875
-
876
- <!--
877
- - ionicon link
878
- -->
879
- <script type="module" src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.esm.js"></script>
880
- <script nomodule src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.js"></script>
881
-
882
-
883
- </body>
884
-
885
-
886
-
887
-
888
-
889
-
 
 
 
 
 
 
 
 
 
 
890
  </html>
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8">
6
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
7
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
8
+ <title>Personal Portfolio</title>
9
+
10
+ <!--
11
+ - favicon
12
+ -->
13
+ <link rel="shortcut icon" href="./assets/images/logo.ico" type="image/x-icon">
14
+
15
+ <!--
16
+ - custom css link
17
+ -->
18
+ <link rel="stylesheet" href="./assets/css/style.css">
19
+
20
+ <!--
21
+ - google font link
22
+ -->
23
+ <link rel="preconnect" href="https://fonts.googleapis.com">
24
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
25
+ <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600&display=swap" rel="stylesheet">
26
+ </head>
27
+
28
+ <body>
29
+
30
+ <!--
31
+ - #MAIN
32
+ -->
33
+
34
+ <main>
35
+
36
+ <!--
37
+ - #SIDEBAR
38
+ -->
39
+
40
+ <aside class="sidebar" data-sidebar>
41
+
42
+ <div class="sidebar-info">
43
+
44
+ <figure class="avatar-box" style=" border-radius: 50px;">
45
+ <img src="./assets/images/MyImage.jpg" alt="Richard hanrick" width="80" style=" border-radius: 20px;" >
46
+ </figure>
47
+
48
+ <div class="info-content">
49
+ <h1 class="name" title="Richard hanrick">Mohammed Abo Ellil</h1>
50
+
51
+ <p class="title">Data Scientist</p>
52
+ </div>
53
+
54
+ <button class="info_more-btn" data-sidebar-btn>
55
+ <span>Show Contacts</span>
56
+
57
+ <ion-icon name="chevron-down"></ion-icon>
58
+ </button>
59
+
60
+ </div>
61
+
62
+ <div class="sidebar-info_more">
63
+
64
+ <div class="separator"></div>
65
+
66
+ <ul class="contacts-list">
67
+
68
+ <li class="contact-item">
69
+
70
+ <div class="icon-box">
71
+ <ion-icon name="mail-outline"></ion-icon>
72
+ </div>
73
+
74
+ <div class="contact-info">
75
+ <p class="contact-title">Email</p>
76
+
77
+ <a href="mailto:mohammedaboellil200@gmail.com" class="contact-link">mohammedaboellil200@gmail.com</a>
78
+ </div>
79
+
80
+ </li>
81
+
82
+ <li class="contact-item">
83
+
84
+ <div class="icon-box">
85
+ <ion-icon name="phone-portrait-outline"></ion-icon>
86
+ </div>
87
+
88
+ <div class="contact-info">
89
+ <p class="contact-title">Phone</p>
90
+
91
+ <a href="tel:+201036689958" class="contact-link">+20 (103) 6689-958</a>
92
+ </div>
93
+
94
+ </li>
95
+
96
+ <li class="contact-item">
97
+
98
+ <div class="icon-box">
99
+ <ion-icon name="calendar-outline"></ion-icon>
100
+ </div>
101
+
102
+ <div class="contact-info">
103
+ <p class="contact-title">Birthday</p>
104
+
105
+ <time datetime="2001-04-229">April 29, 2001</time>
106
+ </div>
107
+
108
+ </li>
109
+
110
+ <li class="contact-item">
111
+
112
+ <div class="icon-box">
113
+ <ion-icon name="location-outline"></ion-icon>
114
+ </div>
115
+
116
+ <div class="contact-info">
117
+ <p class="contact-title">Location</p>
118
+
119
+ <address>Tanta, Ghabia, EGYPT</address>
120
+ </div>
121
+
122
+ </li>
123
+
124
+ </ul>
125
+
126
+ <div class="separator"></div>
127
+
128
+ <ul class="social-list">
129
+
130
+ <li class="social-item">
131
+ <a href="https://www.facebook.com/profile.php?id=61585737173252" class="social-link">
132
+ <ion-icon name="logo-facebook"></ion-icon>
133
+ </a>
134
+ </li>
135
+
136
+ <li class="social-item">
137
+ <a href="https://www.linkedin.com/in/mohammed-aboellil-7806a5245/" class="social-link">
138
+ <ion-icon name="logo-linkedin"></ion-icon>
139
+ </a>
140
+ </li>
141
+ <li class="social-item">
142
+ <a href="https://wa.me/201289071166" class="social-link">
143
+ <ion-icon name="logo-whatsapp"></ion-icon>
144
+ </a>
145
+ </li>
146
+ </li>
147
+ <li class="social-item">
148
+ <a href="https://public.tableau.com/app/profile/mohammed.aboellil/vizzes" class="social-link">
149
+ <ion-icon name="logo-tableau"></ion-icon>
150
+ </a>
151
+ </li>
152
+ <li class="social-item">
153
+ <a href="#" class="social-link">
154
+ <ion-icon name="logo-kaggle"></ion-icon>
155
+ </a>
156
+ </li>
157
+
158
+ </ul>
159
+
160
+ </div>
161
+
162
+ </aside>
163
+
164
+
165
+
166
+
167
+
168
+ <!--
169
+ - #main-content
170
+ -->
171
+
172
+ <div class="main-content">
173
+
174
+ <!--
175
+ - #NAVBAR
176
+ -->
177
+
178
+ <nav class="navbar">
179
+
180
+ <ul class="navbar-list">
181
+
182
+ <li class="navbar-item">
183
+ <button class="navbar-link active" data-nav-link>About</button>
184
+ </li>
185
+
186
+ <li class="navbar-item">
187
+ <button class="navbar-link" data-nav-link>Resume</button>
188
+ </li>
189
+
190
+ <li class="navbar-item">
191
+ <button class="navbar-link" data-nav-link>Portfolio</button>
192
+ </li>
193
+
194
+ <li class="navbar-item">
195
+ <button class="navbar-link" data-nav-link>Certifications</button>
196
+ </li>
197
+
198
+
199
+
200
+ </ul>
201
+
202
+ </nav>
203
+
204
+
205
+
206
+
207
+
208
+ <!--
209
+ - #ABOUT
210
+ -->
211
+
212
+ <article class="about active" data-page="about">
213
+
214
+ <header>
215
+ <h2 class="h2 article-title">About me</h2>
216
+ </header>
217
+
218
+ <section class="about-text">
219
+ <p>
220
+ I am a Data science engineer skilled in Python, SQL, and machine learning frameworks. Experienced in
221
+ projects such as face recognition, indoor localization, and wake word detection, achieving measurable
222
+ improvements like 10% accuracy gains on small datasets. Seeking to apply expertise to analyze data,
223
+ build predictive models, and deploy AI solutions that deliver measurable impact.
224
+ </p>
225
+
226
+ <p>
227
+ I build end-to-end machine learning solutions, from data preprocessing and model development to deployment using modern frameworks. My work emphasizes accuracy, efficiency, and real-time performance, ensuring that AI systems are practical, scalable, and aligned with business needs.
228
+ </p>
229
+ </section>
230
+
231
+
232
+ <!--
233
+ - service
234
+ -->
235
+
236
+ <section class="service">
237
+
238
+ <h3 class="h3 service-title">What i'm doing</h3>
239
+
240
+ <ul class="service-list">
241
+
242
+ <li class="service-item">
243
+
244
+ <div class="service-icon-box">
245
+ <img src="./assets/images/robot.png
246
+ " alt="design icon" width="40">
247
+ </div>
248
+
249
+ <div class="service-content-box">
250
+ <h4 class="h4 service-item-title">Machine Learning & AI</h4>
251
+
252
+ <p class="service-item-text">
253
+ Designing and training machine learning models to solve real-world problems, with a focus on accuracy, efficiency, and practical deployment.
254
+ </p>
255
+ </div>
256
+
257
+ </li>
258
+
259
+ <li class="service-item">
260
+
261
+ <div class="service-icon-box">
262
+ <img src="./assets/images/eye.png" alt="Web development icon" width="40">
263
+ </div>
264
+
265
+ <div class="service-content-box">
266
+ <h4 class="h4 service-item-title">Computer Vision</h4>
267
+
268
+ <p class="service-item-text">
269
+ Building computer vision systems such as face recognition and wake-word detection using deep learning models optimized for real-time and mobile environments.
270
+ </p>
271
+ </div>
272
+
273
+ </li>
274
+
275
+ <li class="service-item">
276
+
277
+ <div class="service-icon-box">
278
+ <img src="./assets/images/map.png" alt="mobile app icon" width="40">
279
+ </div>
280
+
281
+ <div class="service-content-box">
282
+ <h4 class="h4 service-item-title">Indoor Localization & Mapping</h4>
283
+
284
+ <p class="service-item-text">
285
+ Developing WiFi-based indoor localization systems and navigation solutions using deep learning and pathfinding algorithms for accurate indoor positioning.
286
+ </p>
287
+ </div>
288
+
289
+ </li>
290
+
291
+ <li class="service-item">
292
+
293
+ <div class="service-icon-box">
294
+ <img src="./assets/images/project-launch.png" alt="camera icon" width="40">
295
+ </div>
296
+
297
+ <div class="service-content-box">
298
+ <h4 class="h4 service-item-title">Model Deployment & APIs</h4>
299
+
300
+ <p class="service-item-text">
301
+ Deploying machine learning models as scalable REST APIs using FastAPI, ONNX Runtime,TFLite, and cloud-ready architectures.
302
+ </p>
303
+ </div>
304
+
305
+ </li>
306
+
307
+
308
+ <li class="service-item">
309
+
310
+ <div class="service-icon-box">
311
+ <img src="./assets/images/software-application.png" alt="camera icon" width="40">
312
+ </div>
313
+
314
+ <div class="service-content-box">
315
+ <h4 class="h4 service-item-title">AI-Powered Web Applications</h4>
316
+
317
+ <p class="service-item-text">
318
+ Integrating AI models into modern web applications using FastAPI and React to create intelligent, user-friendly systems.
319
+ </p>
320
+ </div>
321
+
322
+ </li>
323
+
324
+ <li class="service-item">
325
+
326
+ <div class="service-icon-box">
327
+ <img src="./assets/images/automation.png" alt="camera icon" width="40">
328
+ </div>
329
+
330
+ <div class="service-content-box">
331
+ <h4 class="h4 service-item-title">Automation & Workflows</h4>
332
+
333
+ <p class="service-item-text">
334
+ Automating data pipelines and AI workflows using n8n to connect models, APIs, and external services efficiently.
335
+ </p>
336
+ </div>
337
+
338
+ </li>
339
+
340
+ </ul>
341
+
342
+ </section>
343
+
344
+
345
+ <!--
346
+ - testimonials
347
+ -->
348
+
349
+ <section class="testimonials">
350
+
351
+ <h3 class="h3 testimonials-title">Technical Stack & Tools</h3>
352
+
353
+ <ul class="testimonials-list has-scrollbar">
354
+
355
+ <li class="testimonials-item">
356
+ <div class="content-card" data-testimonials-item>
357
+
358
+ <figure class="testimonials-avatar-box">
359
+ <img src="./assets/images/Python.png" alt="Daniel lewis" width="60" data-testimonials-avatar>
360
+ </figure>
361
+
362
+ <h4 class="h4 testimonials-item-title" data-testimonials-title>Programing Languages</h4>
363
+ <div class="testimonials-text" data-testimonials-text>
364
+ <p >
365
+ Python has been my go‑to for turning raw data into intelligent solutions, from machine learning models to real‑time systems. With libraries like NumPy, Pandas, TensorFlow, and PyTorch, I’ve built and deployed AI pipelines using FastAPI, ONNX, and TFLite.
366
+ <br>
367
+ JavaScript has been my bridge to building interactive web experiences, especially through React. At an intermediate level, I’ve used it to create dynamic interfaces and connect AI‑powered backends with responsive, real‑time applications.
368
+ </p>
369
+ </div>
370
+
371
+ </div>
372
+ </li>
373
+
374
+ <li class="testimonials-item">
375
+ <div class="content-card" data-testimonials-item>
376
+
377
+ <figure class="testimonials-avatar-box">
378
+ <img src="./assets/images/tf.svg" alt="Jessica miller" width="60" data-testimonials-avatar>
379
+ </figure>
380
+
381
+ <h4 class="h4 testimonials-item-title" data-testimonials-title>AI Frame Work</h4>
382
+ <div class="testimonials-text" data-testimonials-text>
383
+ <p>
384
+ My journey with AI frameworks began when Python became a tool for building intelligent systems, using Scikit-learn and TensorFlow to solve real problems.
385
+ I deploy these models into production by optimizing them with ONNX and TFLite and serving them through FastAPI for fast, scalable AI solutions.
386
+ </p>
387
+ </div>
388
+
389
+ </div>
390
+ </li>
391
+
392
+ <li class="testimonials-item">
393
+ <div class="content-card" data-testimonials-item>
394
+
395
+ <figure class="testimonials-avatar-box">
396
+ <img src="./assets/images/fastapi.svg" alt="Emily evans" width="60" data-testimonials-avatar>
397
+ </figure>
398
+
399
+ <h4 class="h4 testimonials-item-title" data-testimonials-title>AI Deployment</h4>
400
+ <div class="testimonials-text" data-testimonials-text>
401
+ <p>
402
+ FastAPI is where my AI models become real products — I use it to turn trained models into scalable, high-performance APIs that can be reliably consumed by web and mobile applications.
403
+ <br>Through FastAPI, I focus on clean architecture, low-latency inference, and seamless integration between AI backends and real-world systems.
404
+ </p>
405
+ </div>
406
+
407
+ </div>
408
+ </li>
409
+
410
+ <li class="testimonials-item">
411
+ <div class="content-card" data-testimonials-item>
412
+
413
+ <figure class="testimonials-avatar-box">
414
+ <img src="./assets/images/n8n-color.svg" alt="Henry william" width="60" data-testimonials-avatar style="padding:10px;">
415
+ </figure>
416
+
417
+ <h4 class="h4 testimonials-item-title" data-testimonials-title>Automation</h4>
418
+ <div class="testimonials-text" data-testimonials-text>
419
+ <p>
420
+ I use n8n to automate AI workflows and system integrations, turning repetitive processes into reliable, event-driven pipelines.
421
+ Through automation, I connect models, APIs, and data sources to create end-to-end solutions that run efficiently with minimal manual intervention.
422
+ </p>
423
+ </div>
424
+
425
+ </div>
426
+ </li>
427
+
428
+ </ul>
429
+
430
+ </section>
431
+
432
+
433
+ <!--
434
+ - testimonials modal
435
+ -->
436
+
437
+ <div class="modal-container" data-modal-container>
438
+
439
+ <div class="overlay" data-overlay></div>
440
+
441
+ <section class="testimonials-modal">
442
+
443
+ <button class="modal-close-btn" data-modal-close-btn>
444
+ <ion-icon name="close-outline"></ion-icon>
445
+ </button>
446
+
447
+ <div class="modal-img-wrapper">
448
+ <figure class="modal-avatar-box">
449
+ <img src="./assets/images/avatar-1.png" alt="Daniel lewis" width="80" data-modal-img>
450
+ </figure>
451
+
452
+ <img src="./assets/images/icon-quote.svg" alt="quote icon">
453
+ </div>
454
+
455
+ <div class="modal-content" >
456
+
457
+ <h4 class="h3 modal-title" data-modal-title>Daniel lewis</h4>
458
+
459
+ <time datetime="2021-06-14" data-modal-Time>14 June, 2021</time>
460
+
461
+ <div data-modal-text style='color:"fff"'>
462
+ <p>
463
+ Richard was hired to create a corporate identity. We were very pleased with the work done. She has a
464
+ lot of experience
465
+ and is very concerned about the needs of client. Lorem ipsum dolor sit amet, ullamcous cididt
466
+ consectetur adipiscing
467
+ elit, seds do et eiusmod tempor incididunt ut laborels dolore magnarels alia.
468
+ </p>
469
+ </div>
470
+
471
+ </div>
472
+
473
+ </section>
474
+
475
+ </div>
476
+
477
+
478
+ <!--
479
+ - clients
480
+ -->
481
+
482
+ <section class="clients">
483
+
484
+ <h3 class="h3 clients-title">Internships</h3>
485
+
486
+ <ul class="clients-list has-scrollbar">
487
+
488
+ <li class="clients-item">
489
+ <a href="https://iti.gov.eg/">
490
+ <img src="./assets/images/iti-logo-422x430.png" alt="client logo" >
491
+ </a>
492
+ </li>
493
+
494
+ <li class="clients-item">
495
+ <a href="https://maharatech.gov.eg/">
496
+ <img src="./assets/images/mahara.png" alt="client logo">
497
+ </a>
498
+ </li>
499
+
500
+ <li class="clients-item">
501
+ <a href="https://icareer.ai/">
502
+ <img src="./assets/images/icareeregy_logo.png" alt="client logo">
503
+ </a>
504
+ </li>
505
+
506
+ <li class="clients-item">
507
+ <a href="https://www.linkedin.com/company/apps-square/?originalSubdomain=eg">
508
+ <img src="./assets/images/appsq-.png" alt="client logo">
509
+ </a>
510
+ </li>
511
+
512
+
513
+ </ul>
514
+
515
+ </section>
516
+
517
+ </article>
518
+
519
+
520
+
521
+
522
+
523
+ <!--
524
+ - #RESUME
525
+ -->
526
+
527
+ <article class="resume" data-page="resume">
528
+
529
+ <header>
530
+ <h2 class="h2 article-title">Resume</h2>
531
+ </header>
532
+
533
+ <section class="timeline">
534
+
535
+ <div class="title-wrapper">
536
+ <div class="icon-box">
537
+ <ion-icon name="book-outline"></ion-icon>
538
+ </div>
539
+
540
+ <h3 class="h3">Education</h3>
541
+ </div>
542
+
543
+ <ol class="timeline-list">
544
+
545
+ <li class="timeline-item">
546
+
547
+ <h4 class="h4 timeline-item-title">Information Technology Institute ITI</h4>
548
+
549
+ <span>1/2026 6/2026</span>
550
+
551
+ <p class="timeline-text">
552
+ I transform raw data into actionable insights, creating interactive dashboards and reports that empower organizations to make data-driven decisions efficiently and effectively.
553
+ </p>
554
+
555
+ </li>
556
+
557
+ <li class="timeline-item">
558
+
559
+ <h4 class="h4 timeline-item-title"> B.Sc. in Electrical Engineering (Computing and Automatic Control)</h4>
560
+
561
+ <span>2019 — 2024</span>
562
+
563
+ <p class="timeline-text">
564
+ As a Data Science enthusiast with a background in Electrical Engineering (Computing and Automatic Control), I transform complex data into actionable insights, building interactive dashboards and predictive models that support smarter, data-driven business decisions
565
+ </p>
566
+
567
+ </li>
568
+
569
+ </ol>
570
+
571
+ </section>
572
+
573
+ <section class="skill">
574
+
575
+ <h3 class="h3 skills-title">My skills</h3>
576
+
577
+ <ul class="skills-list content-card">
578
+
579
+ <li class="skills-item">
580
+
581
+ <div class="title-wrapper">
582
+ <h5 class="h5">Programming: Python (Advanced), JavaScript
583
+ (Intermediate)
584
+ </h5>
585
+ <!-- <data value="80">80%</data>-->
586
+ </div>
587
+
588
+ </li>
589
+
590
+ <li class="skills-item">
591
+
592
+ <div class="title-wrapper">
593
+ <h5 class="h5">Data Processing : Pandas , NumPy , Statistics</h5>
594
+
595
+ </div>
596
+
597
+ </li>
598
+
599
+ <li class="skills-item">
600
+
601
+ <div class="title-wrapper">
602
+ <h5 class="h5">Data Visualization : Power BI , Excel ,Tableau</h5>
603
+ <data value="90"></data>
604
+ </div>
605
+
606
+ <!--<div class="skill-progress-bg">
607
+ <div class="skill-progress-fill" style="width: 90%;"></div>
608
+ </div>-->
609
+
610
+ </li>
611
+
612
+ <li class="skills-item">
613
+
614
+ <div class="title-wrapper">
615
+ <h5 class="h5">Data Science: Scikit‑learn, TensorFlow</h5>
616
+ <data value="50"></data>
617
+ </div>
618
+
619
+ <!--<div class="skill-progress-bg">
620
+ <div class="skill-progress-fill" style="width: 50%;"></div>
621
+ </div>-->
622
+
623
+ </li>
624
+
625
+ <li class="skills-item">
626
+
627
+ <div class="title-wrapper">
628
+ <h5 class="h5">Web Development: FastAPI, React.js
629
+ </h5>
630
+ <data value="50"></data>
631
+ </div>
632
+
633
+ <!--<div class="skill-progress-bg">
634
+ <div class="skill-progress-fill" style="width: 50%;"></div>
635
+ </div>-->
636
+
637
+ </li>
638
+
639
+ <li class="skills-item">
640
+
641
+ <div class="title-wrapper">
642
+ <h5 class="h5">Automation: n8n</h5>
643
+ <data value="50"></data>
644
+ </div>
645
+
646
+ <!--<div class="skill-progress-bg">
647
+ <div class="skill-progress-fill" style="width: 50%;"></div>
648
+ </div>-->
649
+
650
+ </li>
651
+
652
+
653
+
654
+
655
+
656
+
657
+
658
+ </ul>
659
+
660
+ </section>
661
+
662
+ </article>
663
+
664
+
665
+
666
+
667
+
668
+ <!--
669
+ - #PORTFOLIO
670
+ -->
671
+
672
+ <article class="portfolio" data-page="portfolio">
673
+
674
+ <header>
675
+ <h2 class="h2 article-title">Portfolio</h2>
676
+ </header>
677
+
678
+ <section class="projects">
679
+
680
+ <ul class="filter-list">
681
+
682
+ <li class="filter-item">
683
+ <button class="active" data-filter-btn>All</button>
684
+ </li>
685
+
686
+ <li class="filter-item">
687
+ <button data-filter-btn>AI models</button>
688
+ </li>
689
+
690
+ <li class="filter-item">
691
+ <button data-filter-btn>Dashbords</button>
692
+ </li>
693
+
694
+ <li class="filter-item">
695
+ <button data-filter-btn>Automation</button>
696
+ </li>
697
+ <li class="filter-item">
698
+ <button data-filter-btn>FullStack</button>
699
+ </li>
700
+
701
+ </ul>
702
+
703
+ <div class="filter-select-box">
704
+
705
+ <button class="filter-select" data-select>
706
+
707
+ <div class="select-value" data-selecct-value>Select category</div>
708
+
709
+ <div class="select-icon">
710
+ <ion-icon name="chevron-down"></ion-icon>
711
+ </div>
712
+
713
+ </button>
714
+
715
+ <ul class="select-list">
716
+
717
+ <li class="select-item">
718
+ <button data-select-item>All</button>
719
+ </li>
720
+
721
+ <li class="select-item">
722
+ <button data-select-item>AI Models</button>
723
+ </li>
724
+
725
+ <li class="select-item">
726
+ <button data-select-item>Dashbords</button>
727
+ </li>
728
+
729
+ <li class="select-item">
730
+ <button data-select-item>Automation</button>
731
+ </li>
732
+
733
+ <li class="select-item">
734
+ <button data-select-item>FullStack</button>
735
+ </li>
736
+
737
+ </ul>
738
+
739
+ </div>
740
+
741
+ <ul class="project-list" id="projectList">
742
+ <li class="project-item active" data-filter-item="" data-category="ai models">
743
+ <a href="./ProjectViewr/ProjectViewr.html?data=data/Pro2.json" target="_blank">
744
+ <figure class="project-img">
745
+ <div class="project-item-icon-box">
746
+ <ion-icon name="eye-outline" role="img" class="md hydrated" aria-label="eye outline"></ion-icon>
747
+ </div>
748
+ <img src="./assets/ProImg/FaceRec.png" alt="Face Recognition" loading="lazy" id="LazyImages">
749
+ </figure>
750
+
751
+ <h3 class="project-title">Face Recognition</h3>
752
+ <p class="project-category">AI Models</p>
753
+ </a>
754
+ </li>
755
+
756
+ </ul>
757
+
758
+ </section>
759
+
760
+ </article>
761
+
762
+
763
+
764
+
765
+
766
+ <!--
767
+ - #BLOG
768
+ -->
769
+
770
+ <article class="blog" data-page="certifications">
771
+
772
+ <header>
773
+ <h2 class="h2 article-title">Certificates</h2>
774
+ </header>
775
+
776
+ <section class="blog-posts">
777
+
778
+ <ul class="blog-posts-list" id ="Certificates">
779
+
780
+ </ul>
781
+
782
+ </section>
783
+
784
+ </article>
785
+
786
+
787
+
788
+
789
+
790
+
791
+ </div>
792
+
793
+ </main>
794
+
795
+
796
+ <script>
797
+
798
+ fetch('./data/projects.json')
799
+ .then(response => response.json())
800
+ .then(projects => {
801
+ const projectList = document.getElementById('projectList');
802
+
803
+
804
+ projects.forEach(project => {
805
+ const li = document.createElement('li');
806
+ li.className = 'project-item active';
807
+ li.setAttribute('data-filter-item', '');
808
+ li.setAttribute('data-category', project.filter);
809
+
810
+
811
+ li.innerHTML = `
812
+ <a href="${project.details}" target="_blank">
813
+ <figure class="project-img">
814
+ <div class="project-item-icon-box">
815
+ <ion-icon name="eye-outline"></ion-icon>
816
+ </div>
817
+ <img src="${project.image}" style:"background-url:" alt="${project.title}" loading="lazy">
818
+ </figure>
819
+
820
+ <h3 class="project-title">${project.title}</h3>
821
+ <p class="project-category">${project.category}</p>
822
+ </a>
823
+ `;
824
+
825
+ projectList.appendChild(li);
826
+ });
827
+ })
828
+ .catch(error => console.error('Error loading projects:', error));
829
+
830
+ </script>
831
+
832
+
833
+ <script>
834
+ fetch('./data/Certificates.json')
835
+ .then(response => response.json())
836
+ .then(Certificates => {
837
+ const CertificateList = document.getElementById('Certificates');
838
+
839
+
840
+ Certificates.forEach(Certificate => {
841
+ const li = document.createElement('li');
842
+ li.className = "blog-post-item";
843
+
844
+
845
+ li.innerHTML = `
846
+ <a href="${Certificate.details}" target='_blank'>
847
+
848
+ <figure class="blog-banner-box" >
849
+ <img src="${Certificate.image}" alt="Image" loading="lazy">
850
+ </figure>
851
+
852
+ <div class="blog-content">
853
+
854
+ <div class="blog-meta">
855
+ <p class="blog-category">Certificate.category</p>
856
+
857
+ <span class="dot"></span>
858
+
859
+ <time datetime="2022-02-23">${Certificate.Time}</time>
860
+ </div><h3 class="h3 blog-item-title">${Certificate.title}</h3>
861
+
862
+ <p class="blog-text" >
863
+ ${Certificate.Text}
864
+ </p>
865
+
866
+ </div>
867
+
868
+ </a>
869
+
870
+ `;
871
+
872
+ CertificateList.appendChild(li);
873
+ });
874
+ })
875
+ .catch(error => console.error('Error loading projects:', error));
876
+ </script>
877
+
878
+
879
+
880
+
881
+ <!--
882
+ - custom js link
883
+ -->
884
+ <script src="./assets/js/script.js"></script>
885
+
886
+ <!--
887
+ - ionicon link
888
+ -->
889
+ <script type="module" src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.esm.js"></script>
890
+ <script nomodule src="https://unpkg.com/ionicons@5.5.2/dist/ionicons/ionicons.js"></script>
891
+
892
+
893
+ </body>
894
+
895
+
896
+
897
+
898
+
899
+
900
  </html>