From 358e7aa278c15279dda8e14a7ac1afc9595ea968 Mon Sep 17 00:00:00 2001 From: Rodrigo Opalo Balog Date: Thu, 6 Aug 2026 12:25:24 -0400 Subject: [PATCH 1/3] fix(nav): unify mobile menu surface and navigation --- src/Components/Navbar.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Components/Navbar.tsx b/src/Components/Navbar.tsx index 0c335cd..20feda0 100644 --- a/src/Components/Navbar.tsx +++ b/src/Components/Navbar.tsx @@ -177,7 +177,7 @@ export default function Navbar() {
{navigationLinks.map((link) => (
{navigationLinks.map((link) => ( From a2458f0b2c9861ff35af593cc407f050e4b686a2 Mon Sep 17 00:00:00 2001 From: Rodrigo Opalo Balog Date: Thu, 6 Aug 2026 12:26:32 -0400 Subject: [PATCH 2/3] test(nav): lock mobile navbar visual contracts --- src/test/Navbar.test.tsx | 82 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/src/test/Navbar.test.tsx b/src/test/Navbar.test.tsx index 06c2f1a..311513f 100644 --- a/src/test/Navbar.test.tsx +++ b/src/test/Navbar.test.tsx @@ -124,6 +124,65 @@ describe("Navbar mobile menu", () => { expect(document.getElementById("mobile-navigation-panel")).not.toBeInTheDocument(); expect(localStorage.getItem("language")).toBe("en"); }); + + it.each([ + { + language: "es", + expectedLabels: [ + "Sobre mí", + "Por qué elegirme", + "Servicios", + "Portfolio", + "Contacto", + "FAQ", + ], + servicesHref: "/servicios", + }, + { + language: "en", + expectedLabels: [ + "About me", + "Why choose me", + "Services", + "Portfolio", + "Contact", + "FAQ", + ], + servicesHref: "/en/services", + }, + ] as const)( + "keeps $language desktop, mobile, and no-JavaScript navigation in parity", + async ({ language, expectedLabels, servicesHref }) => { + const user = userEvent.setup(); + renderNavbar({ initialEntry: language === "es" ? "/" : "/en", language }); + + const desktop = getRequiredElement("[data-navbar-desktop]"); + const trigger = screen.getByRole("button", { + name: language === "es" ? "Abrir menú" : "Open menu", + }); + const fallback = getRequiredElement("[data-nojs-mobile-nav]"); + const fallbackLinks = fallback.firstElementChild?.querySelectorAll("a"); + + await user.click(trigger); + + const panel = getRequiredElement("#mobile-navigation-panel"); + const desktopLinks = [...desktop.children].filter( + (element): element is HTMLAnchorElement => + element instanceof HTMLAnchorElement, + ); + const mobileLinks = [...panel.children].filter( + (element): element is HTMLAnchorElement => + element instanceof HTMLAnchorElement, + ); + const noJavaScriptLinks = [...(fallbackLinks ?? [])]; + + for (const links of [desktopLinks, mobileLinks, noJavaScriptLinks]) { + expect(links.map((link) => link.textContent)).toEqual(expectedLabels); + expect(links.filter((link) => link.getAttribute("href") === servicesHref)) + .toHaveLength(1); + } + }, + ); }); describe("Navbar color tokens", () => { @@ -156,6 +215,29 @@ describe("Navbar color tokens", () => { expect(spanishButton).toHaveClass("text-white", "hover:text-primary"); expect(englishButton).toHaveClass("text-primary", "hover:text-primary"); }); + + it("keeps one approved translucent surface around the mobile panels", async () => { + const user = userEvent.setup(); + renderNavbar(); + const navbar = getRequiredElement("nav[data-nojs-navbar]"); + const trigger = screen.getByRole("button", { name: "Abrir menú" }); + const fallback = getRequiredElement("[data-nojs-mobile-nav]"); + + expect(navbar).toHaveClass( + "bg-black/70", + "backdrop-blur-xl", + "backdrop-saturate-150", + ); + expect(fallback.parentElement).toBe(navbar); + expect(fallback).not.toHaveClass("bg-black/90", "backdrop-blur-sm"); + + await user.click(trigger); + + const panel = getRequiredElement("#mobile-navigation-panel"); + expect(panel.parentElement).toBe(navbar); + expect(panel).not.toHaveClass("bg-black/90", "backdrop-blur-sm"); + expect(navbar.querySelectorAll('[class*="backdrop-blur"]')).toHaveLength(0); + }); }); describe("Navbar no-JavaScript fallback", () => { From 40e5b8056022f17b1c511c811575b54b10c7dd57 Mon Sep 17 00:00:00 2001 From: Rodrigo Opalo Balog Date: Thu, 6 Aug 2026 21:07:00 -0400 Subject: [PATCH 3/3] chore(ci): retrigger checks after GitHub Actions outage