Skip to content

Commit fcd9225

Browse files
committed
Performance, accessibility, SEO, and general improvements
- P1: Replace full duplicate inline CSS with minimal critical above-the-fold CSS (~2KB) - P2: Replace Font Awesome CDN (50KB+) with inline SVGs for 6 contact icons - P3+P4: Register Service Worker from script.js, create offline.html fallback - P5: Add srcset/sizes for responsive logo loading - P6+P7+P8: Remove unused logo.png (116KB), consolidate manifests, delete site.webmanifest - A1: Add prefers-reduced-motion support disabling animations/transitions - A2: Darken maintenance overlay (42% -> 75%) for WCAG contrast compliance - A3: Add role=alert to sticky service banner - A4: Convert popup to proper dialog with role=dialog, aria-modal, focus trap - A5: Toggle aria-hidden on project extra wrapper when collapsed - A6: Increase touch targets to 44x44px minimum (close-banner, contact links) - A7: Add visible label for newsletter email input - S1: Expand sitemap from 4 to 14 URLs covering all sub-projects - S2+S3: Add BreadcrumbList JSON-LD, 9 more SoftwareApplication entries - S4+S5: Remove external domain from sitemap, remove deprecated meta keywords - G1+G3: Remove redundant Cookiebot defer, add content-visibility to below-fold sections
1 parent d914e4b commit fcd9225

10 files changed

Lines changed: 340 additions & 66 deletions

File tree

index.html

Lines changed: 149 additions & 25 deletions
Large diffs are not rendered by default.

logo.png

-116 KB
Binary file not shown.

offline.html

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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>Offline | HellenicDev</title>
7+
<meta name="description" content="You are offline. Check your connection and try again.">
8+
<meta name="robots" content="noindex, follow">
9+
<meta property="og:title" content="Offline | HellenicDev">
10+
<meta property="og:description" content="You are offline. Check your connection and try again.">
11+
<meta property="og:url" content="https://hellenicdev.github.io/offline.html">
12+
<meta property="og:type" content="website">
13+
<link rel="canonical" href="https://hellenicdev.github.io/">
14+
<style>
15+
body{font-family:Arial,sans-serif;background:#111;color:#fff;display:flex;flex-direction:column;justify-content:center;align-items:center;height:100vh;margin:0;text-align:center;padding:20px;animation:fadeIn 1s ease-out}
16+
pre{font-family:monospace;font-size:1rem;color:#38bdf8;margin-bottom:20px}
17+
p{font-size:1.2rem;margin-bottom:30px;max-width:500px;color:#ccc}
18+
.outline-button{display:inline-block;padding:12px 24px;font-family:monospace;font-size:16px;color:#38bdf8;border:2px solid #38bdf8;border-radius:6px;text-decoration:none;transition:all .3s ease}
19+
.outline-button:hover{background-color:#141625;color:#fff;transform:translateY(-2px)}
20+
:focus-visible{outline:3px solid #38bdf8;outline-offset:3px}
21+
@keyframes fadeIn{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}
22+
</style>
23+
</head>
24+
<body>
25+
<a href="https://hellenicdev.github.io/?utm_source=offline" class="skip-link" style="position:absolute;top:-100%;left:50%;transform:translateX(-50%);background:#fff;color:#111;padding:8px 16px;border-radius:0 0 8px 8px;z-index:9999;text-decoration:none;font-weight:700">Skip to home</a>
26+
<pre><strong>
27+
___ __ _____ ___ _ _ ___
28+
/ _ \/ / | ___|/ _ \| || | / _ \
29+
/ /_\/ / | |_ / /_\ \ || |_| | | |
30+
| _ | | _| | _ |__ _| |_| |
31+
| | | | | | | | | | | | \___/
32+
\_| |_| \_| \_| |_/ |_|
33+
</strong></pre>
34+
<p>You're offline. The cached version of the site may still work — try navigating back home.</p>
35+
<a href="https://hellenicdev.github.io/?utm_source=offline" class="outline-button">Go back home</a>
36+
</body>
37+
</html>

privacy-policy.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ <h2>13. Trademark Notice </h2>
171171
</ul>
172172
<p> These materials may not be copied, reproduced, modified, distributed, or used in any form without prior written permission from HellenicDev™.</p>
173173
<p> Any third-party trademarks, product names, company names, or logos that may appear on this website are the property of their respective owners and are used for identification or reference purposes only.</p>
174-
<button onclick="window.location.href='https://hellenicdev.github.io?utm_source=privacy-policy';">
174+
<button onclick="window.location.href='https://hellenicdev.github.io';">
175175
Back to Site
176176
</button>
177177
</body>

script.js

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,22 @@
1+
// =====================
2+
// Service Worker registration
3+
// =====================
4+
if ('serviceWorker' in navigator) {
5+
window.addEventListener('load', () => {
6+
navigator.serviceWorker.register('/sw.js').catch(() => {});
7+
});
8+
}
9+
10+
// =====================
11+
// Logo click handler
12+
// =====================
13+
document.addEventListener('DOMContentLoaded', () => {
14+
const logo = document.querySelector('.logo');
15+
if (logo) {
16+
logo.addEventListener('click', showThankYou);
17+
}
18+
});
19+
120
// =====================
221
// Google Analytics (delayed load)
322
// =====================
@@ -70,15 +89,47 @@ function showForm(token) {
7089

7190

7291
// =====================
73-
// Popup ad (safe)
92+
// Popup ad (safe) — dialog with focus trap
7493
// =====================
7594
window.addEventListener("load", () => {
7695
const popup = document.getElementById('popup-ad');
77-
if (!popup) return;
96+
const closeBtn = document.getElementById('popupCloseBtn');
97+
if (!popup || !closeBtn) return;
7898

79-
setTimeout(() => {
99+
function openPopup() {
80100
popup.style.display = 'block';
81-
}, 5000);
101+
popup.setAttribute('aria-hidden', 'false');
102+
closeBtn.focus();
103+
// trap focus inside popup
104+
popup.addEventListener('keydown', trapFocus);
105+
}
106+
107+
function closePopup() {
108+
popup.style.display = 'none';
109+
popup.setAttribute('aria-hidden', 'true');
110+
popup.removeEventListener('keydown', trapFocus);
111+
}
112+
113+
function trapFocus(e) {
114+
const focusable = popup.querySelectorAll('a, button, [tabindex]:not([tabindex="-1"])');
115+
if (!focusable.length) return;
116+
const first = focusable[0];
117+
const last = focusable[focusable.length - 1];
118+
if (e.key === 'Tab') {
119+
if (e.shiftKey && document.activeElement === first) {
120+
e.preventDefault();
121+
last.focus();
122+
} else if (!e.shiftKey && document.activeElement === last) {
123+
e.preventDefault();
124+
first.focus();
125+
}
126+
}
127+
if (e.key === 'Escape') closePopup();
128+
}
129+
130+
closeBtn.addEventListener('click', closePopup);
131+
132+
setTimeout(openPopup, 5000);
82133
});
83134

84135

script.min.js

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

site.webmanifest

Lines changed: 0 additions & 21 deletions
This file was deleted.

sitemap.xml

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,85 @@
11
<?xml version="1.0" encoding="UTF-8"?>
2-
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
2+
<urlset xmlns="http://www.w3.org/2000/schema/sitemap/0.9">
33
<url>
44
<loc>https://hellenicdev.github.io/</loc>
5-
<lastmod>2026-06-05</lastmod>
5+
<lastmod>2026-06-14</lastmod>
66
<changefreq>weekly</changefreq>
77
<priority>1.0</priority>
88
</url>
99
<url>
1010
<loc>https://hellenicdev.github.io/privacy-policy.html</loc>
11-
<lastmod>2026-05-09</lastmod>
11+
<lastmod>2026-06-05</lastmod>
1212
<changefreq>monthly</changefreq>
1313
<priority>0.3</priority>
1414
</url>
15+
<url>
16+
<loc>https://hellenicdev.github.io/404.html</loc>
17+
<lastmod>2026-06-05</lastmod>
18+
<changefreq>monthly</changefreq>
19+
<priority>0.1</priority>
20+
</url>
1521
<url>
1622
<loc>https://hellenicdev.github.io/codriver/frontend/</loc>
17-
<lastmod>2026-05-19</lastmod>
23+
<lastmod>2026-06-05</lastmod>
1824
<changefreq>weekly</changefreq>
19-
<priority>0.7</priority>
25+
<priority>0.8</priority>
26+
</url>
27+
<url>
28+
<loc>https://hellenicdev.github.io/clicker-game</loc>
29+
<lastmod>2026-06-05</lastmod>
30+
<changefreq>monthly</changefreq>
31+
<priority>0.6</priority>
32+
</url>
33+
<url>
34+
<loc>https://hellenicdev.github.io/the-quiz</loc>
35+
<lastmod>2026-05-19</lastmod>
36+
<changefreq>monthly</changefreq>
37+
<priority>0.6</priority>
38+
</url>
39+
<url>
40+
<loc>https://hellenicdev.github.io/e-table</loc>
41+
<lastmod>2026-05-19</lastmod>
42+
<changefreq>monthly</changefreq>
43+
<priority>0.5</priority>
44+
</url>
45+
<url>
46+
<loc>https://hellenicdev.github.io/dodge-and-survive</loc>
47+
<lastmod>2026-05-19</lastmod>
48+
<changefreq>monthly</changefreq>
49+
<priority>0.6</priority>
50+
</url>
51+
<url>
52+
<loc>https://hellenicdev.github.io/the-sound-quiz</loc>
53+
<lastmod>2026-05-19</lastmod>
54+
<changefreq>monthly</changefreq>
55+
<priority>0.6</priority>
56+
</url>
57+
<url>
58+
<loc>https://hellenicdev.github.io/pi-radio</loc>
59+
<lastmod>2026-06-05</lastmod>
60+
<changefreq>monthly</changefreq>
61+
<priority>0.5</priority>
62+
</url>
63+
<url>
64+
<loc>https://hellenicdev.github.io/jump-stack</loc>
65+
<lastmod>2026-06-05</lastmod>
66+
<changefreq>monthly</changefreq>
67+
<priority>0.6</priority>
68+
</url>
69+
<url>
70+
<loc>https://hellenicdev.github.io/every-iphone</loc>
71+
<lastmod>2026-06-05</lastmod>
72+
<changefreq>monthly</changefreq>
73+
<priority>0.6</priority>
74+
</url>
75+
<url>
76+
<loc>https://hellenicdev.github.io/block-drop</loc>
77+
<lastmod>2026-06-05</lastmod>
78+
<changefreq>monthly</changefreq>
79+
<priority>0.6</priority>
2080
</url>
2181
<url>
22-
<loc>https://currency-converter-7fmk.onrender.com</loc>
82+
<loc>https://hellenicdev.github.io/budget-tracker</loc>
2383
<lastmod>2026-05-19</lastmod>
2484
<changefreq>monthly</changefreq>
2585
<priority>0.5</priority>

style.css

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -371,37 +371,31 @@ iframe {
371371
.contact-mail {
372372
margin: 10px;
373373
color:#D44638;
374-
font-size:30px;
375374
}
376375

377376
.contact-youtube {
378377
margin:0 10px;
379378
color:#FF0000;
380-
font-size:30px;
381379
}
382380

383381
.contact-github {
384382
margin:0 10px;
385383
color:#333333;
386-
font-size:30px;
387384
}
388385

389386
.contact-discord {
390387
margin:0 10px;
391388
color:#5865F2;
392-
font-size:30px;
393389
}
394390

395391
.contact-reddit {
396392
margin:0 10px;
397393
color:#FF4500;
398-
font-size:30px;
399394
}
400395

401396
.contact-viber {
402397
margin:0 10px;
403398
color:#7360F2;
404-
font-size:30px;
405399
}
406400

407401
.contact-substack {
@@ -456,9 +450,18 @@ iframe {
456450
.contacts {
457451
text-align:center;
458452
margin-bottom:40px;
459-
align-items: center;
460453
margin: 0 auto;
461454
}
455+
.contacts a {
456+
display:inline-flex;
457+
align-items:center;
458+
justify-content:center;
459+
min-width:44px;
460+
min-height:44px;
461+
text-decoration:none;
462+
}
463+
464+
/* SECRET 7 */
462465

463466
/* =====================
464467
Accessibility
@@ -619,4 +622,22 @@ iframe {
619622
}
620623
}
621624

625+
@media (prefers-reduced-motion: reduce) {
626+
*, *::before, *::after {
627+
animation-duration: 0.01ms !important;
628+
animation-iteration-count: 1 !important;
629+
transition-duration: 0.01ms !important;
630+
scroll-behavior: auto !important;
631+
}
632+
}
633+
634+
.maintenance-tag {
635+
background: rgba(17, 17, 17, 0.75);
636+
}
637+
638+
.content-visibility-auto {
639+
content-visibility: auto;
640+
contain-intrinsic-size: 500px;
641+
}
642+
622643
/* SECRET 7 */

0 commit comments

Comments
 (0)