health: fix broken pages, add image dimensions, a11y & SEO wins

Site-wide health pass (excludes in-progress blog work). Verified with a
local server + headless browser: Timeline, homepage and gallery pages load
with zero console errors and no layout distortion.

Render bugs
- Timeline page (en/mk/si): fix ../../../ paths that overshot the site root,
  so the main stylesheet and hero image load again.
- Meet Student Slovenia 2023 (en/mk/si): remove a <figure> referencing
  event3-photo-11.png, an image that was never uploaded (broken image).

Performance
- Add intrinsic width/height to 1039 raster <img> tags to prevent layout
  shift (CLS); 450 SVGs correctly skipped. Add a global
  `img { max-width:100%; height:auto }` safety net so aspect ratio is
  preserved and images never overflow.
- Preload the homepage hero (LCP) image on en/mk/si.
- Load Font Awesome non-blocking (media=print/onload swap) with a <noscript>
  fallback, on 225 pages.

Accessibility
- Add aria-label to 57 unlabeled newsletter email inputs.
- Add an sr-only <h1> to the three "My Route" pages (had no h1).
- Add an .sr-only utility class.

SEO
- Add meta descriptions to legal/msos-hub/support pages (en/mk/si).

Note: MK/SI meta descriptions are machine-drafted and should be proofread
by a native speaker before considering them final.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
popovskikandClaude Opus 4.8 committed 2026-08-04 00:31:27 +02:00
1 parent 168e4ce378
commit 9ce7450aa1
209 files changed
+1289 -1267

No files matched your search

@@ -56,7 +56,7 @@
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<!-- Font Awesome (for icons) -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" integrity="sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" integrity="sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==" crossorigin="anonymous" referrerpolicy="no-referrer" media="print" onload="this.media=&#39;all&#39;" /><noscript><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" integrity="sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==" crossorigin="anonymous" referrerpolicy="no-referrer" /></noscript>
<!-- Correct path to the main CSS file -->
<link rel="stylesheet" href="../../../css/main.css">
@@ -200,7 +200,7 @@
</header>
<figure class="article-main-image">
<img fetchpriority="high" src="../../../images/macedonia-skopje-stone-bridge-hero.webp" alt="The Stone Bridge over the Vardar in Skopje">
<img width="810" height="540" fetchpriority="high" src="../../../images/macedonia-skopje-stone-bridge-hero.webp" alt="The Stone Bridge over the Vardar in Skopje">
<figcaption>Stone Bridge, Skopje. Photo: <a href="https://macedonia-timeless.com/eng/about/about/did-you-know/stone-bridge" target="_blank" rel="noopener">macedonia-timeless.com</a></figcaption>
</figure>
@@ -242,7 +242,7 @@
<p>The bazaar is also one of the places where Skopje's multicultural character is most visible. Different religious, linguistic, culinary, and commercial traditions meet within a relatively small space.</p>
<figure class="article-inline-image">
<img loading="lazy" decoding="async" src="../../../images/macedonia-skopje-old-bazaar.webp" alt="A working street in the Old Skopje Bazaar">
<img width="1020" height="680" loading="lazy" decoding="async" src="../../../images/macedonia-skopje-old-bazaar.webp" alt="A working street in the Old Skopje Bazaar">
<figcaption>Old Bazaar, Skopje. Photo: <a href="https://visit-skopje.com/old-bazaar-skopje/" target="_blank" rel="noopener">visit-skopje.com</a></figcaption>
</figure>
@@ -273,7 +273,7 @@
<p>To understand Skopje, it is worth looking beyond whether someone finds a building beautiful. The more important question is what problem it was trying to solve and what moment in the city's history produced it.</p>
<figure class="article-inline-image">
<img loading="lazy" decoding="async" src="../../../images/macedonia-skopje-old-railway-station.webp" alt="The Museum of the City of Skopje in the former railway station">
<img width="1400" height="933" loading="lazy" decoding="async" src="../../../images/macedonia-skopje-old-railway-station.webp" alt="The Museum of the City of Skopje in the former railway station">
<figcaption>Museum of the City of Skopje. Photo: <a href="https://museumskopje.mk/" target="_blank" rel="noopener">museumskopje.mk</a></figcaption>
</figure>
@@ -292,7 +292,7 @@
<p>The contrast is not abstract. It can happen within the same day.</p>
<figure class="article-inline-image">
<img loading="lazy" decoding="async" src="../../../images/macedonia-skopje-vodno-view.webp" alt="A view of Skopje from Mount Vodno">
<img width="825" height="550" loading="lazy" decoding="async" src="../../../images/macedonia-skopje-vodno-view.webp" alt="A view of Skopje from Mount Vodno">
<figcaption>Mount Vodno, Skopje. Photo: <a href="https://visit-skopje.com/mount-vodno-skopje-best-views-hiking-trails-millennium-cross-guide/" target="_blank" rel="noopener">visit-skopje.com</a></figcaption>
</figure>