From 275bce3b8712f476a39f932be27b435b79e31227 Mon Sep 17 00:00:00 2001 From: asowneryt Date: Wed, 30 Sep 2026 20:52:53 +1300 Subject: [PATCH] Phase 6: QA fixes for Lighthouse and navigation - Map is a titled iframe (accessibility); drop @next/third-parties - "Services" nav toggle is a real button with aria-expanded (SEO crawlable-anchors, accessibility) - Hero images use default quality; page-header image is preloaded (LCP) - Mobile services submenu no longer clips its last item Mobile Lighthouse: / 94/100/100/100, /services/computer-repair 96/100/100/100, /areas/henderson 97/100/100/100, /contact 95/100/100/100 (performance/accessibility/best practices/SEO). Co-Authored-By: Claude Opus 5.5 --- package-lock.json | 20 -------------------- package.json | 1 - src/app/components/HeaderSm.js | 2 +- src/app/components/MapEmbed.js | 14 ++++++++------ src/app/components/Navbar.js | 8 +++++--- src/app/components/Navbar.module.css | 10 +++++++++- src/app/page.js | 1 - 7 files changed, 23 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8d8f9a5..3145bed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,6 @@ "version": "0.1.0", "dependencies": { "@next/env": "^16.2.10", - "@next/third-parties": "^16.2.10", "@radix-ui/react-accordion": "^1.2.3", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", @@ -1304,19 +1303,6 @@ "node": ">= 10" } }, - "node_modules/@next/third-parties": { - "version": "16.2.10", - "resolved": "https://registry.npmjs.org/@next/third-parties/-/third-parties-16.2.10.tgz", - "integrity": "sha512-H3yxCMLziM1JKXnjQv83WBH2cp1fB1vMxpC1/bBTpvvaesBEuRuprpzq5RI32atis0VhUZflgdpJdGNZIGpQaQ==", - "license": "MIT", - "dependencies": { - "third-party-capital": "1.0.20" - }, - "peerDependencies": { - "next": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0-beta.0", - "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -7298,12 +7284,6 @@ "node": ">=18" } }, - "node_modules/third-party-capital": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/third-party-capital/-/third-party-capital-1.0.20.tgz", - "integrity": "sha512-oB7yIimd8SuGptespDAZnNkzIz+NWaJCu2RMsbs4Wmp9zSDUM8Nhi3s2OOcqYuv3mN4hitXc8DVx+LyUmbUDiA==", - "license": "ISC" - }, "node_modules/tinyglobby": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", diff --git a/package.json b/package.json index 58e3e9c..29c0447 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,6 @@ }, "dependencies": { "@next/env": "^16.2.10", - "@next/third-parties": "^16.2.10", "@radix-ui/react-accordion": "^1.2.3", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", diff --git a/src/app/components/HeaderSm.js b/src/app/components/HeaderSm.js index f3c7d43..53d08db 100644 --- a/src/app/components/HeaderSm.js +++ b/src/app/components/HeaderSm.js @@ -10,8 +10,8 @@ export default function HeaderSm({ text }) { src={bgimage} alt="" placeholder="blur" - quality={100} fill + priority sizes="100vw" style={{ objectFit: "cover", diff --git a/src/app/components/MapEmbed.js b/src/app/components/MapEmbed.js index d8a8fdc..c8f0104 100644 --- a/src/app/components/MapEmbed.js +++ b/src/app/components/MapEmbed.js @@ -1,17 +1,19 @@ -import { GoogleMapsEmbed } from "@next/third-parties/google"; - // This key is public by design; restrict it by HTTP referrer in Google Cloud Console. const MAPS_API_KEY = "AIzaSyDbgQY55TQY5CefsCUwKbc8RfoOUe8U5gY"; const PLACE_ID = "ChIJz0ZoDYhADW0R0TDgWoWMq0M"; +// Plain iframe so it can have an accessible title. export default function MapEmbed({ height = "400px" }) { return ( - ); } diff --git a/src/app/components/Navbar.js b/src/app/components/Navbar.js index 3ac5f92..ea25f2a 100644 --- a/src/app/components/Navbar.js +++ b/src/app/components/Navbar.js @@ -87,13 +87,15 @@ export default function Navbar() { data-state={isDropdownActive ? "open" : "close"} className="flex items-center justify-center gap-1 [&[data-state=open]>svg]:rotate-180" > - Services - +
    diff --git a/src/app/components/Navbar.module.css b/src/app/components/Navbar.module.css index 8d44c82..69a0194 100644 --- a/src/app/components/Navbar.module.css +++ b/src/app/components/Navbar.module.css @@ -131,7 +131,7 @@ } .dropdownActive .dropdownMenu { - max-height: 20em; + max-height: 30em; transition: max-height 0.5s cubic-bezier(0.215, 0.61, 0.355, 1); } } @@ -219,3 +219,11 @@ .dropdown:not(.dropdownActive) .dropdownTitle { margin-bottom: 0; } + +.dropdownTitle { + cursor: pointer; +} + +.dropdownTitle.active { + font-weight: bold; +} diff --git a/src/app/page.js b/src/app/page.js index 0407f6d..609f79c 100644 --- a/src/app/page.js +++ b/src/app/page.js @@ -120,7 +120,6 @@ export default function Home() { src={bgimage} alt="" placeholder="blur" - quality={100} fill priority sizes="100vw"