From bb6f244f04c0e422566ad222498409e1612e6d30 Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Sun, 25 Oct 2026 17:15:06 +0700 Subject: [PATCH 1/4] fix(site): localize public navigation and skip links for EN/ID --- landing/partials/header.html | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/landing/partials/header.html b/landing/partials/header.html index 935561531..1bba475cb 100644 --- a/landing/partials/header.html +++ b/landing/partials/header.html @@ -1,21 +1,26 @@ - + \ No newline at end of file From ebc3ca102ccfc60cf2d22993e47c6d7b57a2a229 Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Sun, 25 Oct 2026 17:15:09 +0700 Subject: [PATCH 2/4] fix(a11y): localize mobile menu accessible names --- landing/app.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/landing/app.js b/landing/app.js index 94e3e6a79..8dd813385 100644 --- a/landing/app.js +++ b/landing/app.js @@ -12,19 +12,25 @@ const toggle = document.querySelector('[data-menu-toggle]'); const links = document.querySelector('[data-nav-links]'); + const isIndonesian = document.documentElement.lang === 'id'; + const menuLabel = isIndonesian + ? { open: 'Buka navigasi', close: 'Tutup navigasi' } + : { open: 'Open navigation', close: 'Close navigation' }; + links?.setAttribute('aria-label', isIndonesian ? 'Navigasi utama' : 'Primary navigation'); + toggle?.setAttribute('aria-label', menuLabel.open); const closeMenu = () => { if (!toggle || !links) return; links.classList.remove('open'); toggle.setAttribute('aria-expanded', 'false'); - toggle.setAttribute('aria-label', 'Open navigation'); + toggle.setAttribute('aria-label', menuLabel.open); }; if (toggle && links) { toggle.addEventListener('click', () => { const isOpen = links.classList.toggle('open'); toggle.setAttribute('aria-expanded', String(isOpen)); - toggle.setAttribute('aria-label', isOpen ? 'Close navigation' : 'Open navigation'); + toggle.setAttribute('aria-label', isOpen ? menuLabel.close : menuLabel.open); }); links.addEventListener('click', event => { From d8e9420061004a04da5a13015983d9ee6a8ecafb Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Sun, 25 Oct 2026 17:15:12 +0700 Subject: [PATCH 3/4] test(site): guard bilingual routes and keyboard menu labels --- .../WebsiteHeroLocalizationRegressionTests.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/ARSAS.Tests/WebsiteHeroLocalizationRegressionTests.cs b/tests/ARSAS.Tests/WebsiteHeroLocalizationRegressionTests.cs index b8aa06904..d5343dc4e 100644 --- a/tests/ARSAS.Tests/WebsiteHeroLocalizationRegressionTests.cs +++ b/tests/ARSAS.Tests/WebsiteHeroLocalizationRegressionTests.cs @@ -138,6 +138,28 @@ public void GuidedDemo_UsesActualV1642CapturesWithOriginalPngLinks(string path) } } + [Fact] + public void PublicNavigation_UsesLocaleSpecificDestinationsAndAccessibleMenuLabels() + { + var header = Read("landing/partials/header.html"); + var css = Read("landing/audit.css"); + var app = Read("landing/app.js"); + + Assert.Contains("Langsung ke konten", header, StringComparison.Ordinal); + Assert.Contains("href=\"id.html\" data-nav-page=\"overview\" data-lang=\"id\"", header, StringComparison.Ordinal); + Assert.Contains("href=\"pusat-belajar-iec61850.html\" data-nav-page=\"learn\" data-lang=\"id\"", header, StringComparison.Ordinal); + Assert.Contains("href=\"panduan.html\" data-nav-page=\"guides\" data-lang=\"id\"", header, StringComparison.Ordinal); + Assert.Contains("href=\"unduh.html\" data-nav-page=\"download\"", header, StringComparison.Ordinal); + Assert.Contains("href=\"./\" lang=\"en\" hreflang=\"en\"", header, StringComparison.Ordinal); + Assert.Contains("aria-controls=\"arsas-primary-nav\"", header, StringComparison.Ordinal); + Assert.Contains("[data-lang=\"id\"] { display: none; }", css, StringComparison.Ordinal); + Assert.Contains("html[lang=\"id\"] [data-lang=\"en\"] { display: none; }", css, StringComparison.Ordinal); + Assert.Contains("Buka navigasi", app, StringComparison.Ordinal); + Assert.Contains("Tutup navigasi", app, StringComparison.Ordinal); + Assert.Contains("Navigasi utama", app, StringComparison.Ordinal); + Assert.Contains("menuLabel.close : menuLabel.open", app, StringComparison.Ordinal); + } + [Fact] public void CssArchitecture_ReplacesPhaseOverridesWithSemanticScopedLayers() { From 246133cdef8b0b85f960ba685dbca3e0a2b278bd Mon Sep 17 00:00:00 2001 From: Ari Sulistiono Date: Sun, 25 Oct 2026 17:15:37 +0700 Subject: [PATCH 4/4] fix(nav): close mobile menu when tapping localized link text --- landing/app.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/landing/app.js b/landing/app.js index 8dd813385..9cf7df37b 100644 --- a/landing/app.js +++ b/landing/app.js @@ -34,7 +34,9 @@ }); links.addEventListener('click', event => { - if (event.target instanceof HTMLAnchorElement) closeMenu(); + // Localized link labels contain spans; taps on their text must also close the menu. + const target = event.target instanceof Element ? event.target.closest('a[href]') : null; + if (target instanceof HTMLAnchorElement && links.contains(target)) closeMenu(); }); document.addEventListener('keydown', event => {