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

+20 -20
View File
@@ -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>
<!-- Правилна патека до главната CSS-датотека -->
<link rel="stylesheet" href="../../../css/main.css">
@@ -201,14 +201,14 @@
</header>
<figure class="article-main-image">
<img fetchpriority="high" src="../../../images/paint-wine-1.webp" alt="Настанот Сликање и вино на зајдисонце во Горица">
<img width="1600" height="1067" fetchpriority="high" src="../../../images/paint-wine-1.webp" alt="Настанот Сликање и вино на зајдисонце во Горица">
</figure>
<div class="article-body">
<p>На Меѓународниот ден на жената, тимот на МСОС Нова Горица го одржа својот прв локален настан во соработка со Македонското културно друштво „Охридски Бисери“. Студенти од Љубљана, Нова Горица и околниот регион ја преминаа границата во Горица, Италија, за вечер на сликање, вино и музика.</p>
<figure class="article-inline-image">
<img loading="lazy" decoding="async" src="../../../images/paint-wine-2.webp" alt="Студенти сликаат на вечерта на сликање и вино">
<img width="720" height="480" loading="lazy" decoding="async" src="../../../images/paint-wine-2.webp" alt="Студенти сликаат на вечерта на сликање и вино">
</figure>
<h2>Прв пат за МСОС Нова Горица</h2>
@@ -216,7 +216,7 @@
<p>Ова беше повеќе од само настан. Беше првата официјална активност организирана од нашиот нов тим на МСОС Нова Горица. Со поддршка од Македонското културно друштво „Охридски Бисери“, го претворивме пријатното место Etnoteca Mama Angela во простор исполнет со креативност и смеа.</p>
<figure class="article-inline-image">
<img loading="lazy" decoding="async" src="../../../images/paint-wine-3.webp" alt="Пријатното место Etnoteca Mama Angela">
<img width="1600" height="1067" loading="lazy" decoding="async" src="../../../images/paint-wine-3.webp" alt="Пријатното место Etnoteca Mama Angela">
</figure>
<h2>Уметност, музика и заедништво</h2>
@@ -226,11 +226,11 @@
<p>DJ во живо ѝ даде на вечерта жив ритам, претворајќи ја во повеќе од само работилница. Стана славење. Меѓу потезите со четка и ритмите, студентите се поврзуваа, споделуваа приказни и уживаа во атмосфера што беше и креативна и празнична.</p>
<figure class="article-inline-image">
<img loading="lazy" decoding="async" src="../../../images/paint-wine-4.webp" alt="Платната се полнат со боја додека студентите сликаат">
<img width="720" height="480" loading="lazy" decoding="async" src="../../../images/paint-wine-4.webp" alt="Платната се полнат со боја додека студентите сликаат">
</figure>
<figure class="article-inline-image">
<img loading="lazy" decoding="async" src="../../../images/paint-wine-5.webp" alt="Студентите заедно уживаат во вино и музика">
<img width="720" height="480" loading="lazy" decoding="async" src="../../../images/paint-wine-5.webp" alt="Студентите заедно уживаат во вино и музика">
</figure>
<h2>Зошто беше важно</h2>
@@ -244,11 +244,11 @@
</div>
<figure class="article-inline-image">
<img loading="lazy" decoding="async" src="../../../images/paint-wine-6.webp" alt="Завршените слики изложени">
<img width="720" height="480" loading="lazy" decoding="async" src="../../../images/paint-wine-6.webp" alt="Завршените слики изложени">
</figure>
<figure class="article-inline-image">
<img loading="lazy" decoding="async" src="../../../images/paint-wine-7.webp" alt="Групата ужива во славењето">
<img width="720" height="480" loading="lazy" decoding="async" src="../../../images/paint-wine-7.webp" alt="Групата ужива во славењето">
</figure>
<h2>Поглед напред</h2>
@@ -256,26 +256,26 @@
<p>Вечерта на сликање и вино покажа дека МСОС Нова Горица е подготвена да донесе свежи идеи и енергија во нашето студентско семејство. Од ѕвонењето на чашите вино до платната што се полнеа со боја, вечерта на сите им остави спомени и по некој прст обоен со боја, што нема да се заборават.</p>
<figure class="article-inline-image">
<img loading="lazy" decoding="async" src="../../../images/paint-wine-8.webp" alt="Спомен од вечерта на сликање и вино">
<img width="720" height="480" loading="lazy" decoding="async" src="../../../images/paint-wine-8.webp" alt="Спомен од вечерта на сликање и вино">
</figure>
<figure class="article-inline-image">
<img loading="lazy" decoding="async" src="../../../images/paint-wine-9.webp" alt="Заедницата на МСОС Нова Горица на зајдисонце">
<img width="1600" height="1067" loading="lazy" decoding="async" src="../../../images/paint-wine-9.webp" alt="Заедницата на МСОС Нова Горица на зајдисонце">
</figure>
</div>
<section class="event-gallery">
<h2 class="event-gallery-title">Фотографии од настанот</h2>
<div class="event-gallery-grid js-lightbox">
<button type="button" class="eg-thumb" data-full="../../../images/paint-wine-1.webp" data-caption="Сликање и вино на зајдисонце"><img loading="lazy" decoding="async" src="../../../images/paint-wine-1.webp" alt="Сликање и вино на зајдисонце, photo 1"></button>
<button type="button" class="eg-thumb" data-full="../../../images/paint-wine-2.webp" data-caption="Сликање и вино на зајдисонце"><img loading="lazy" decoding="async" src="../../../images/paint-wine-2.webp" alt="Сликање и вино на зајдисонце, photo 2"></button>
<button type="button" class="eg-thumb" data-full="../../../images/paint-wine-3.webp" data-caption="Сликање и вино на зајдисонце"><img loading="lazy" decoding="async" src="../../../images/paint-wine-3.webp" alt="Сликање и вино на зајдисонце, photo 3"></button>
<button type="button" class="eg-thumb" data-full="../../../images/paint-wine-4.webp" data-caption="Сликање и вино на зајдисонце"><img loading="lazy" decoding="async" src="../../../images/paint-wine-4.webp" alt="Сликање и вино на зајдисонце, photo 4"></button>
<button type="button" class="eg-thumb" data-full="../../../images/paint-wine-5.webp" data-caption="Сликање и вино на зајдисонце"><img loading="lazy" decoding="async" src="../../../images/paint-wine-5.webp" alt="Сликање и вино на зајдисонце, photo 5"><span class="eg-more">+4</span></button>
<button type="button" class="eg-thumb is-hidden" data-full="../../../images/paint-wine-6.webp" data-caption="Сликање и вино на зајдисонце"><img loading="lazy" decoding="async" src="../../../images/paint-wine-6.webp" alt="Сликање и вино на зајдисонце, photo 6"></button>
<button type="button" class="eg-thumb is-hidden" data-full="../../../images/paint-wine-7.webp" data-caption="Сликање и вино на зајдисонце"><img loading="lazy" decoding="async" src="../../../images/paint-wine-7.webp" alt="Сликање и вино на зајдисонце, photo 7"></button>
<button type="button" class="eg-thumb is-hidden" data-full="../../../images/paint-wine-8.webp" data-caption="Сликање и вино на зајдисонце"><img loading="lazy" decoding="async" src="../../../images/paint-wine-8.webp" alt="Сликање и вино на зајдисонце, photo 8"></button>
<button type="button" class="eg-thumb is-hidden" data-full="../../../images/paint-wine-9.webp" data-caption="Сликање и вино на зајдисонце"><img loading="lazy" decoding="async" src="../../../images/paint-wine-9.webp" alt="Сликање и вино на зајдисонце, photo 9"></button>
<button type="button" class="eg-thumb" data-full="../../../images/paint-wine-1.webp" data-caption="Сликање и вино на зајдисонце"><img width="1600" height="1067" loading="lazy" decoding="async" src="../../../images/paint-wine-1.webp" alt="Сликање и вино на зајдисонце, photo 1"></button>
<button type="button" class="eg-thumb" data-full="../../../images/paint-wine-2.webp" data-caption="Сликање и вино на зајдисонце"><img width="720" height="480" loading="lazy" decoding="async" src="../../../images/paint-wine-2.webp" alt="Сликање и вино на зајдисонце, photo 2"></button>
<button type="button" class="eg-thumb" data-full="../../../images/paint-wine-3.webp" data-caption="Сликање и вино на зајдисонце"><img width="1600" height="1067" loading="lazy" decoding="async" src="../../../images/paint-wine-3.webp" alt="Сликање и вино на зајдисонце, photo 3"></button>
<button type="button" class="eg-thumb" data-full="../../../images/paint-wine-4.webp" data-caption="Сликање и вино на зајдисонце"><img width="720" height="480" loading="lazy" decoding="async" src="../../../images/paint-wine-4.webp" alt="Сликање и вино на зајдисонце, photo 4"></button>
<button type="button" class="eg-thumb" data-full="../../../images/paint-wine-5.webp" data-caption="Сликање и вино на зајдисонце"><img width="720" height="480" loading="lazy" decoding="async" src="../../../images/paint-wine-5.webp" alt="Сликање и вино на зајдисонце, photo 5"><span class="eg-more">+4</span></button>
<button type="button" class="eg-thumb is-hidden" data-full="../../../images/paint-wine-6.webp" data-caption="Сликање и вино на зајдисонце"><img width="720" height="480" loading="lazy" decoding="async" src="../../../images/paint-wine-6.webp" alt="Сликање и вино на зајдисонце, photo 6"></button>
<button type="button" class="eg-thumb is-hidden" data-full="../../../images/paint-wine-7.webp" data-caption="Сликање и вино на зајдисонце"><img width="720" height="480" loading="lazy" decoding="async" src="../../../images/paint-wine-7.webp" alt="Сликање и вино на зајдисонце, photo 7"></button>
<button type="button" class="eg-thumb is-hidden" data-full="../../../images/paint-wine-8.webp" data-caption="Сликање и вино на зајдисонце"><img width="720" height="480" loading="lazy" decoding="async" src="../../../images/paint-wine-8.webp" alt="Сликање и вино на зајдисонце, photo 8"></button>
<button type="button" class="eg-thumb is-hidden" data-full="../../../images/paint-wine-9.webp" data-caption="Сликање и вино на зајдисонце"><img width="1600" height="1067" loading="lazy" decoding="async" src="../../../images/paint-wine-9.webp" alt="Сликање и вино на зајдисонце, photo 9"></button>
</div>
</section>
</article>
@@ -286,7 +286,7 @@
<p>Вести, соопштенија и отворени повици, директно во вашето сандаче.</p>
<form class="subscribe-form-bottom">
<div class="input-wrapper">
<input type="email" placeholder="Внесете ја вашата е-пошта">
<input type="email" placeholder="Внесете ја вашата е-пошта" aria-label="Е-пошта">
</div>
<button type="submit" class="btn btn-primary-orange">Претплати се</button>
</form>