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>
<!-- Правилна патека до главната CSS-датотека -->
<link rel="stylesheet" href="../../../css/main.css">
@@ -201,7 +201,7 @@
</header>
<figure class="article-main-image">
<img fetchpriority="high" src="../../../images/msnl-1.webp" alt="Атмосфера од македонската студентска вечер во Љубљана">
<img width="1430" height="757" fetchpriority="high" src="../../../images/msnl-1.webp" alt="Атмосфера од македонската студентска вечер во Љубљана">
</figure>
<div class="article-body">
@@ -211,7 +211,7 @@
<p>Сè започна со едноставна желба, да се собереме, да се запознаеме и да ја почувствуваме Македонија, иако сме далеку од неа. Кристијан Поповски, тогаш студент на Економскиот факултет во Љубљана, ја сподели својата идеја со неколку колеги, а одговорот беше неверојатен. За помалку од две недели, преку 40 студенти се пријавија во организацискиот тим. Секој понесе дел од својот ентузијазам и време, а заедничкиот дух и желбата за поврзување ја претворија оваа спонтана иницијатива во настан што долго ќе го паметиме.</p>
<figure class="article-inline-image">
<img loading="lazy" decoding="async" src="../../../images/msnl-2.webp" alt="Подготовки и состаноци за македонската студентска вечер">
<img width="936" height="422" loading="lazy" decoding="async" src="../../../images/msnl-2.webp" alt="Подготовки и состаноци за македонската студентска вечер">
<figcaption>Фотографии од подготовките и состаноците за организирање на македонската студентска вечер</figcaption>
</figure>
@@ -219,7 +219,7 @@
<p>Една недела пред настанот, секој ден објавувавме интересни факти за Македонија, нејзините национални богатства, музика и култура. Полека, но сигурно, ја градевме атмосферата и ентузијазмот, не само кај македонските студенти, туку и кај многу други кои сакаа да ја почувствуваат нашата енергија.</p>
<figure class="article-inline-image">
<img loading="lazy" decoding="async" src="../../../images/msnl-3.webp" alt="Хамер со испишани кирилични и латинични букви">
<img width="1087" height="586" loading="lazy" decoding="async" src="../../../images/msnl-3.webp" alt="Хамер со испишани кирилични и латинични букви">
<figcaption>Хамер со испишани кирилични и латинични букви. Словенците ја учат македонската азбука, додека македонците ги подучуваат.</figcaption>
</figure>
@@ -232,14 +232,14 @@
<p>Журката започна во 20:00 часот и беше замислена во два дела. Првиот дел беше вистинско гастрономско и културно патување низ Македонија. Студентите можеа да пробаат лебчиња со ајвар и биено сирење, македонско вино, вкусни грицки и традиционални пијалоци. На масите имаше изложени и други автентични производи што сите ги потсетуваа на дома. Сите овие вкусови и мириси беа овозможени благодарение на поддршката од продавницата за македонски производи <strong>„Македонија Трејд“</strong>, кои несебично придонесоа овој дел од вечерта да биде вистинско уживање.</p>
<figure class="article-inline-image">
<img loading="lazy" decoding="async" src="../../../images/msnl-4.webp" alt="Штандови со македонски обележја, традиционална храна и пијалаци">
<img width="1430" height="641" loading="lazy" decoding="async" src="../../../images/msnl-4.webp" alt="Штандови со македонски обележја, традиционална храна и пијалаци">
<figcaption>Фотографии од штандовите со македонски обележја, традиционална храна и пијалаци.</figcaption>
</figure>
<p>Покрај храната, посетителите можеа да разгледаат интересни факти за државата, фотографии од познати македонски дејци и културни знаменитости, како и да видат традиционални носии и <strong>гајда</strong> одблиску. Атмосферата беше топла и полна со љубопитност, како мала изложба во рамките на една голема студентска забава.</p>
<figure class="article-inline-image">
<img loading="lazy" decoding="async" src="../../../images/msnl-5.webp" alt="Мини квиз со прашања за Македонија">
<img width="1194" height="565" loading="lazy" decoding="async" src="../../../images/msnl-5.webp" alt="Мини квиз со прашања за Македонија">
<figcaption>Мини квиз со прашања за Македонија, каде студентите во едниот дел од клубот се натпреваруваат</figcaption>
</figure>
@@ -247,7 +247,7 @@
<p>Вечерта беше збогатена и со присуството на важни гости од македонската заедница во Словенија. На настанот ни се придружи <strong>претседателот на Сојузот на македонските културни друштва во Словенија, г-н Благоја Настески</strong>, кој со своето присуство ја потврди важноста на ваквите иницијативи за одржување на македонскиот дух и традиција во дијаспората.</p>
<figure class="article-inline-image">
<img loading="lazy" decoding="async" src="../../../images/msnl-6.webp" alt="Кристијан и Бисера заедно со амбасадорката Зеленковска и претседателот г-н Настески">
<img width="856" height="452" loading="lazy" decoding="async" src="../../../images/msnl-6.webp" alt="Кристијан и Бисера заедно со амбасадорката Зеленковска и претседателот г-н Настески">
<figcaption>Кристијан и Бисера заедно со амбасадорката Зеленковска и претседателот на Сојузот на македонски друштва, г-н Настески</figcaption>
</figure>
@@ -264,7 +264,7 @@
<p>Оваа ноќ го постави темелот за Македонската студентска организација во Словенија и ни покажа дека со ентузијазам, заедништво и малку храброст, може да се создаде нешто што ќе ги обедини луѓето и ќе им даде чувство на дом, дури и кога се далеку од него.</p>
<figure class="article-inline-image">
<img loading="lazy" decoding="async" src="../../../images/msnl-7.webp" alt="Посветениот тим на волонтери по завршувањето на настанот">
<img width="1430" height="592" loading="lazy" decoding="async" src="../../../images/msnl-7.webp" alt="Посветениот тим на волонтери по завршувањето на настанот">
<figcaption>Фотографија направена во 4 часот наутро, по завршувањето и средувањето на просторот заедно со посветениот тим на волонтери</figcaption>
</figure>
</div>
@@ -273,20 +273,20 @@
<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/msnl-1.webp" data-caption="Македонска студентска вечер во Љубљана"><img loading="lazy" decoding="async" src="../../../images/msnl-1.webp" alt="Македонска студентска вечер во Љубљана, photo 1"></button>
<button type="button" class="eg-thumb" data-full="../../../images/msnl-2.webp" data-caption="Македонска студентска вечер во Љубљана"><img loading="lazy" decoding="async" src="../../../images/msnl-2.webp" alt="Македонска студентска вечер во Љубљана, photo 2"></button>
<button type="button" class="eg-thumb" data-full="../../../images/msnl-3.webp" data-caption="Македонска студентска вечер во Љубљана"><img loading="lazy" decoding="async" src="../../../images/msnl-3.webp" alt="Македонска студентска вечер во Љубљана, photo 3"></button>
<button type="button" class="eg-thumb" data-full="../../../images/msnl-4.webp" data-caption="Македонска студентска вечер во Љубљана"><img loading="lazy" decoding="async" src="../../../images/msnl-4.webp" alt="Македонска студентска вечер во Љубљана, photo 4"></button>
<button type="button" class="eg-thumb" data-full="../../../images/msnl-5.webp" data-caption="Македонска студентска вечер во Љубљана"><img loading="lazy" decoding="async" src="../../../images/msnl-5.webp" alt="Македонска студентска вечер во Љубљана, photo 5"><span class="eg-more">+2</span></button>
<button type="button" class="eg-thumb is-hidden" data-full="../../../images/msnl-6.webp" data-caption="Македонска студентска вечер во Љубљана"><img loading="lazy" decoding="async" src="../../../images/msnl-6.webp" alt="Македонска студентска вечер во Љубљана, photo 6"></button>
<button type="button" class="eg-thumb is-hidden" data-full="../../../images/msnl-7.webp" data-caption="Македонска студентска вечер во Љубљана"><img loading="lazy" decoding="async" src="../../../images/msnl-7.webp" alt="Македонска студентска вечер во Љубљана, photo 7"></button>
<button type="button" class="eg-thumb" data-full="../../../images/msnl-1.webp" data-caption="Македонска студентска вечер во Љубљана"><img width="1430" height="757" loading="lazy" decoding="async" src="../../../images/msnl-1.webp" alt="Македонска студентска вечер во Љубљана, photo 1"></button>
<button type="button" class="eg-thumb" data-full="../../../images/msnl-2.webp" data-caption="Македонска студентска вечер во Љубљана"><img width="936" height="422" loading="lazy" decoding="async" src="../../../images/msnl-2.webp" alt="Македонска студентска вечер во Љубљана, photo 2"></button>
<button type="button" class="eg-thumb" data-full="../../../images/msnl-3.webp" data-caption="Македонска студентска вечер во Љубљана"><img width="1087" height="586" loading="lazy" decoding="async" src="../../../images/msnl-3.webp" alt="Македонска студентска вечер во Љубљана, photo 3"></button>
<button type="button" class="eg-thumb" data-full="../../../images/msnl-4.webp" data-caption="Македонска студентска вечер во Љубљана"><img width="1430" height="641" loading="lazy" decoding="async" src="../../../images/msnl-4.webp" alt="Македонска студентска вечер во Љубљана, photo 4"></button>
<button type="button" class="eg-thumb" data-full="../../../images/msnl-5.webp" data-caption="Македонска студентска вечер во Љубљана"><img width="1194" height="565" loading="lazy" decoding="async" src="../../../images/msnl-5.webp" alt="Македонска студентска вечер во Љубљана, photo 5"><span class="eg-more">+2</span></button>
<button type="button" class="eg-thumb is-hidden" data-full="../../../images/msnl-6.webp" data-caption="Македонска студентска вечер во Љубљана"><img width="856" height="452" loading="lazy" decoding="async" src="../../../images/msnl-6.webp" alt="Македонска студентска вечер во Љубљана, photo 6"></button>
<button type="button" class="eg-thumb is-hidden" data-full="../../../images/msnl-7.webp" data-caption="Македонска студентска вечер во Љубљана"><img width="1430" height="592" loading="lazy" decoding="async" src="../../../images/msnl-7.webp" alt="Македонска студентска вечер во Љубљана, photo 7"></button>
</div>
</section>
<footer class="article-footer">
<hr>
<div class="author-share-section">
<div class="author-details">
<img loading="lazy" decoding="async" src="../../../images/11-boy.webp" alt="Аватар на Кристијан Поповски">
<img width="1280" height="1920" loading="lazy" decoding="async" src="../../../images/11-boy.webp" alt="Аватар на Кристијан Поповски">
<div class="author-text">
<p class="author-name">Кристијан Поповски</p>
<p class="author-title">Претседател и основач</p>
@@ -309,7 +309,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>