🔴 Real bugs / correctness
- Duplicate attributes
- First hero slide image has
fetchpriority="high"twice. Remove one.
- First hero slide image has
- Duplicate IDs used for ARIA
- You reuse
id="h-news"for multiple blocks (e.g., News and Videos tiles usearia-labelledby="h-news"). IDs must be unique or assistive tech gets confused. - Fix: make them unique (e.g.,
h-news,h-videos) and updatearia-labelledbyaccordingly.
- You reuse
- Newsletter forms submit via GET
- Two Mailchimp forms use
method="get". That leaks emails in URLs/history/logs and can be cached. - Fix: use POST:
<form action="https://wdg.us10.list-manage.com/subscribe/post?u=255057cc391ca0facb169b81c&id=004f59aa22&f_id=00b5c6e5f0" method="post" …> - Add
<input type="hidden" name="u" …>etc. if your JS isn’t already packing it.
- Two Mailchimp forms use
- JSON-LD caption typo
Rose Gardentin the ImageObject caption – fix spelling to “Rose Garden”.
- Redundant attributes
- Many
imghaveloading="lazy"twice. Clean to one.
- Many
🟠 Performance (LCP/CLS/JS)
- LCP image + priority
- Good that the first slide image has
fetchpriority="high". Also adddecoding="async"and ensure it’s the actual above-the-fold image. - Consider an AVIF/WebP
<picture>for the hero:<picture> <source type="image/avif" srcset="/wp-content/uploads/2025/04/liberation-day-potus.avif"> <source type="image/webp" srcset="/wp-content/uploads/2025/04/liberation-day-potus.webp"> <img src="/wp-content/uploads/2025/04/liberation-day-potus.jpg" width="3000" height="2000" fetchpriority="high" decoding="async" alt="…"> </picture>
- Good that the first slide image has
- Contain-intrinsic-size ratio
- You globally set:
img:is([sizes="auto" i],[sizes^="auto," i]){contain-intrinsic-size:3000px 1500px;}That’s a 2:1 box, but many images are 3:2 (3000×2000). Mismatched placeholders can cause subtle CLS. - Safer: use a more representative ratio (e.g.,
3000px 2000px) or rely on per-imagewidth/height/aspect-ratiowhere you have it.
- You globally set:
- Font preloads
- You preload many weights/styles. Keep only those used in above-the-fold (e.g., regular + display) to reduce connection pressure; defer the rest to
font-display: swap(you already have swap 👍).
- You preload many weights/styles. Keep only those used in above-the-fold (e.g., regular + display) to reduce connection pressure; defer the rest to
- Speculation Rules
- Nice touch. Ensure you keep excluding subscription endpoints and any URLs with PII (switching newsletter to POST helps here).
🟡 Accessibility
- Autoplaying carousel
- Swiper is configured with
autoplayandpauseOnHover:false. Offer a visible Pause/Play control and honorprefers-reduced-motion:@media (prefers-reduced-motion: reduce){ .swiper { --swiper-autoplay: 0 !important; } }Or disable autoplay whenwindow.matchMedia('(prefers-reduced-motion: reduce)')matches.
- Live regions for form feedback
- Add polite announcements so SR users hear success/error:
<div class="wp-block-whitehouse-newsletter__form--responses" aria-live="polite" aria-atomic="true"> … </div>
- Link purpose
- Several cover tiles use an empty anchor with
aria-labelledbypointing to an<h2>—good pattern. Just ensure (see #2) those IDs are unique everywhere.
🔷 Security & privacy
- Content Security Policy (Report-Only)
- With GTM, Mailchimp, Swiper, etc., add CSP-RO and iterate down:
Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://www.googletagmanager.com https://chimpstatic.com; connect-src 'self' https://www.google-analytics.com https://wdg.us10.list-manage.com; img-src 'self' data: https:; style-src 'self' 'unsafe-inline'; font-src 'self' https:; frame-src https://www.googletagmanager.com; report-uri https://your-endpoint.example/csp;
- Preconnect for third-parties
- You preconnect GTM/Analytics; also preconnect Mailchimp origins to reduce TTFB on first subscribe:
<link rel="preconnect" href="https://chimpstatic.com" crossorigin> <link rel="preconnect" href="https://wdg.us10.list-manage.com" crossorigin>
🧼 Small polish
- Avoid duplicated
loadingand other attributes across images (clean output). - Consistent
decoding="async"on non-critical images (many already have it). - Pause/loop semantics for motion
If you keep autoplay carousels, expose Pause/Play button witharia-pressedfor WCAG 2.2.2 compliance. - Social cards
OG/Twitter are solid. Consider alsoog:image:alt:<meta property="og:image:alt" content="The White House emblem with text The White House">
✅ What’s already great
- Solid JSON-LD (WebSite, Organization).
- Fonts self-hosted with
font-display: swap. prefetchspeculation rules.- Skip-link script injected.
- Many images include explicit
width/heightand modernsizes.
If you’d like, I can hand you a tiny patch set (one CSS file + two small template diffs) that: (a) fixes duplicate IDs, (b) flips newsletter method to POST with ARIA live regions, (c) tunes the intrinsic-size ratio and prefers-reduced-motion, and (d) cleans duplicate attributes—all without touching the visual design.