Skip to content
PTS-tillsyn17 pågående tillsynsärenden mot svensk e-handel
Granska
Stack-specifik scan

WCAG-fixar för Next.js

Granska detekterar er Next.js-version, identifierar WCAG-fel i tema och tillägg, och genererar JSX / TSX-fixar med rätt syntax — inte generiska rekommendationer.

1.2M
produktionssajter
60%
av svensk SaaS-front-end
7
vanligaste WCAG-fel
01 · Felmönster

De 7 vanligaste WCAG-felen i Next.js

Mönster vi ser i SaaS-frontends och custom e-handel byggda med App Router och Pages Router.

CriticalWCAG 4.1.2

Ikonknappar utan tillgängligt namn

Knappar som bara innehåller <Icon /> utan aria-label eller dold text — vanligt i headers, cart-buttons och nav-toggles byggda med shadcn/ui-fragment.

CriticalWCAG 1.3.1

Semantiska element ersatta med <div>

Custom buttons som <div onClick> istället för <button>, navigation i <ul> istället för <nav>. React-konventionen att rendera 'whatever, style it later' bryter semantiken.

HighWCAG 2.1.2

Modaler/dialoger utan focus-trap

Custom dropdowns och sheets utan focus-management. Radix UI och Headless UI fixar det, men hand-rullade Dialog-komponenter missar typiskt focus-trap och return-on-close.

HighWCAG 1.1.1

Next/Image utan alt-attribut

next/image kräver alt men accepterar tom sträng. Många dev-team använder alt='' även för innehållsbilder, vilket genererar tom alt i HTML.

HighWCAG 2.4.3

Felaktig fokusordning vid client-side navigation

Next.js App Router behåller fokus vid soft navigation, vilket gör att skärmläsaren inte annonserar att sidan har bytts — användaren 'tappas bort'.

MediumWCAG 3.1.1

Lang-attribut hårdkodat eller saknat

<html lang="en"> kvarstår från create-next-app-template. För svenska sajter måste det vara <html lang="sv"> eller dynamiskt per route.

LowWCAG 1.4.10

Layoutbrott vid 200% zoom

Fixed-width container med h-screen + overflow-hidden bryter på 320px viewport / 200% zoom — gäller särskilt SaaS-dashboards och mobil-versions av landing-pages.

02 · Stack-detektering

Så identifierar Granska att ni kör Next.js

Build-output
_next/static/... · __next_data__ inline JSON
Headers
X-Powered-By: Next.js · Vercel CDN headers
Router-fingerprint
App Router: /app prefix · Pages: /_next/data/
Standard-paths
_next/image · _next/static/css · /api/...
03 · JSX-fixar

Tre kodfixar för vanliga Next.js-issues

CriticalWCAG 4.1.2 — Tillgängligt namn

Icon-only button med tillgänglig text

components/CartButton.tsx
React 19 / Next 15+
// Före (Granska upptäcker)
<button onClick={openCart}>
  <CartIcon />
</button>

// Efter (Granska-fix)
<button
  type="button"
  onClick={openCart}
  aria-label="Öppna varukorg"
>
  <CartIcon aria-hidden="true" />
  <span className="sr-only">Öppna varukorg</span>
</button>
HighWCAG 2.4.3 — Route announce

Annonsera sidbyten i App Router till skärmläsare

app/RouteAnnouncer.tsx
App Router (RSC)
"use client";

import { usePathname } from "next/navigation";
import { useEffect, useState } from "react";

export function RouteAnnouncer() {
  const pathname = usePathname();
  const [title, setTitle] = useState("");

  useEffect(() => {
    setTitle(document.title);
  }, [pathname]);

  return (
    <div
      role="status"
      aria-live="polite"
      aria-atomic="true"
      className="sr-only"
    >
      {title && `Navigerade till ${title}`}
    </div>
  );
}
HighWCAG 1.3.1 — Semantik

Ersätt div onClick med faktisk button

components/Card.tsx
React 19 / TSX
// Före (Granska upptäcker — div utan tangentbordsstöd)
<div
  onClick={handleClick}
  className="cursor-pointer"
>
  <h3>{title}</h3>
</div>

// Efter (Granska-fix — semantisk button-wrapper)
<button
  type="button"
  onClick={handleClick}
  className="text-left cursor-pointer focus:outline-none focus:ring-2"
>
  <h3>{title}</h3>
</button>

// ELLER om hela kortet ska vara en länk:
<Link
  href={href}
  className="block focus:outline-none focus:ring-2"
>
  <h3>{title}</h3>
</Link>
04 · Bibliotek-specifika fixar

Vanliga problem per UI-bibliotek

shadcn/uiIcon-only buttons saknar sr-only-textLokala komponenter, kan inte uppdateras via npm
Radix UIGenerellt utmärkt; problem uppstår vid custom wrappersWrapper-komponenter
Headless UIInga out-of-the-box brister; styling kan dölja focus-ringTailwind-class override
MUI / Material UITouch-targets under 44×44 i compact-modeTheme-override
MantineDefault-färger nära men inte över 4.5:1Theme color overrides
Custom (hand-rolled)Varierar — ofta saknad ARIA, fel role, ingen focus-trapKomponent-revision
05 · Router-specifika fixar

App Router vs Pages Router — vad vi ser

App Router (Next 13+)Soft-nav announces inte sida-byteUse route-aware aria-live region
App Router + RSCLoading states utan aria-busySuspense + aria-live
Pages Routernext/router.push behåller fokususeFocusOnRouteChange-hook
Statisk exportSaknad sitemap/robots utan custom confignext.config + public/

Skanna er Next.js-sajt på 60 sekunder

Granska detekterar Next.js-version, router-typ och UI-bibliotek, och genererar TSX-diffar med rätt komponent-kontext.

Automatiserad scanning hittar 30–40 % av alla WCAG-fel. Full compliance kräver även manuell granskning.