1) Navigation semantics (replace ARIA menu pattern)
Your primary and quicklinks navs use role="menu" / role="menuitem" with <span class="nolink"> triggers. That pattern is for application menus, not site navigation, and harms keyboard/AT behavior.
Do this instead:
- Remove
role="menu"/role="menuitem"everywhere in site nav. - Make parent triggers real links or real buttons.
<!-- BEFORE (simplified) -->
<ul class="menu sf-menu" role="menu" aria-label="Menu">
<li role="none">
<span class="menuparent nolink" role="menuitem" aria-haspopup="true" aria-expanded="false">Hotline</span>
<ul role="menu">…</ul>
</li>
</ul>
<!-- AFTER -->
<nav aria-label="Primary">
<ul class="menu sf-menu">
<li>
<button class="menuparent"
aria-haspopup="true" aria-expanded="false"
aria-controls="nav-hotline-sub">
Hotline
</button>
<ul id="nav-hotline-sub">…</ul>
</li>
</ul>
</nav>
If you prefer pure links, make “Hotline” a link to /hotline and keep the submenu for deep links; no ARIA menu roles needed.
2) Search forms need an explicit (sr-only) label
The front-page simple search uses only a placeholder.
<!-- BEFORE -->
<input placeholder="Search" class="form-control" id="edit-fulltext" name="fulltext">
<!-- AFTER -->
<label class="sr-only" for="edit-fulltext">Search the site</label>
<input placeholder="Search" class="form-control" id="edit-fulltext" name="fulltext">
(You already have proper labels on some other search boxes—mirror that here.)
3) Decorative vs informative images
Several images are decorative but have non-empty alt text (“Decorative”) or meaningful text plus conflicting signals.
- For decorative images:
alt="" aria-hidden="true". - For informative images: keep meaningful
altand do not addaria-hidden.
<!-- Carousel decorative tile -->
<img loading="lazy" src="/sites/.../Scam1_0.png"
width="1080" height="1080" alt="" aria-hidden="true">
<!-- Logo: informative (keep) -->
<img class="logo-lockup" src="/themes/.../logoLockup-1.png"
width="417" alt="GSA Office of Inspector General">
If you render two logo variants back-to-back, hide the redundant one from AT:
<img class="logo-lockup" src="/themes/.../logoLockup-1.png" alt="GSA Office of Inspector General">
<img class="logo-lockup" src="/themes/.../logoLockup-2.png" alt="" aria-hidden="true">
Inline SVG icons used purely as bullets/buttons should be aria-hidden="true" and have no empty <title> elements:
<svg class="icon icon-radio-checked" aria-hidden="true" focusable="false">…</svg>
4) Phone numbers should be clickable (and labeled)
Turn the hotline numbers into tel: links and add accessible names.
<p class="lato20">
<svg class="icon icon-phone" aria-hidden="true" focusable="false">…</svg>
<a href="tel:+12025011780" aria-label="Call the hotline at 202-501-1780">202-501-1780</a>
</p>
<p class="lato20">
<svg class="icon icon-phone" aria-hidden="true" focusable="false">…</svg>
<a href="tel:+18004245210" aria-label="Call the hotline at 800-424-5210">800-424-5210</a>
</p>
5) External links that open new tabs
For links with target="_blank", add rel="noopener noreferrer" for security/perf, and consider aria-label that announces “opens in a new tab”.
<a href="https://twitter.com/gsa_oig" target="_blank" rel="noopener noreferrer"
aria-label="GSA OIG on X (opens in a new tab)">
…
</a>
6) Use HTTPS for protocol-relative scripts/CDNs
Change //stackpath…, //cdnjs…, //platform.twitter.com… to https://… to avoid mixed-content issues.
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>
<script async src="https://platform.twitter.com/widgets.js"></script>
7) Preconnect hints for faster third-party loads
Small but safe perf wins:
<link rel="preconnect" href="https://fonts.googleapis.com" crossorigin>
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="preconnect" href="https://www.googletagmanager.com" crossorigin>
(You already async-load gtag.)
8) Social/OG metadata (improves sharing)
Add minimal Open Graph/Twitter tags:
<meta property="og:site_name" content="GSA Office of Inspector General">
<meta property="og:type" content="website">
<meta property="og:url" content="https://www.gsaig.gov/">
<meta property="og:title" content="GSA Office of Inspector General">
<meta property="og:description" content="Promoting economy, efficiency, and effectiveness in GSA programs and operations.">
<meta property="og:image" content="https://www.gsaig.gov/themes/custom/oig_bootstrap/assets/images/homepage/logoLockup-1.png">
<meta property="og:image:alt" content="GSA Office of Inspector General logo">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="GSA Office of Inspector General">
<meta name="twitter:description" content="Promoting economy, efficiency, and effectiveness in GSA programs and operations.">
<meta name="twitter:image" content="https://www.gsaig.gov/themes/custom/oig_bootstrap/assets/images/homepage/logoLockup-1.png">
<meta name="twitter:image:alt" content="GSA Office of Inspector General logo">
9) Headline semantics in slider
Carousel item titles are rendered inside <span>s. For AT and outline, use real headings (<h2>/<h3>) inside each slide.
<!-- BEFORE -->
<span class="field field--name-title …">Scam Alert: …</span>
<!-- AFTER -->
<h2 class="slide-title">Scam Alert: Beware of Fake Websites …</h2>
10) Prefer reduced motion for carousel
Respect user preference to reduce motion:
@media (prefers-reduced-motion: reduce) {
.owl-carousel, .owl-stage, .owl-item {
animation: none !important;
transition: none !important;
}
}
11) Title formatting
<title>GSA Office of Inspector General |</title> has a trailing bar. Either drop it or complete it:
<title>GSA Office of Inspector General</title>
<!-- or -->
<title>GSA Office of Inspector General | Home</title>
12) Minor HTML hygiene
- Keep the skip link target once (you already have
<a id="main-content">—good). - Ensure all images have width/height (you already do on most; keep doing that to reduce CLS).
- Keep the Cloudflare email obfuscation, but consider adding
aria-label="Email GSA OIG general contact"on the anchor for clarity.
Quick summary
- ✅ Replace ARIA “application menu” roles in nav with native nav semantics.
- ✅ Add sr-only label to the simple search.
- ✅ Fix alt text:
alt="" aria-hidden="true"for decorative; keep meaningful alts for informative. - ✅ Make hotline numbers
tel:links. - ✅ Add
rel="noopener noreferrer"totarget="_blank"links. - ✅ Force HTTPS on protocol-relative assets.
- ✅ Add
preconnecthints for fonts/gtm. - ✅ Add OG/Twitter meta.
- ✅ Use headings inside slides; add reduced-motion CSS.
- ✅ Tidy the page
<title>.
If you want, I can package these into a tiny Drupal theme patch (Twig snippets + library updates) targeting just the header/nav, search, carousel, and sidebar.