LinkButton
Un <a href> con la silueta del botón. Lo que reemplaza son cuatro pantallas que navegaban con <Button onClick={() => router.push(…)}>: sobre un botón, el navegador no da ctrl/⌘-clic, ni clic central, ni «abrir en pestaña nueva», ni copiar la dirección — y Next no da ni prefetch ni useLinkStatus. Eso último está medido: 4507–5073 ms sin un solo píxel de acuse.
🖱️ Pruébalo: ctrl/⌘-clic abre otra pestaña · clic central también · el menú contextual ofrece copiar la dirección · y el navegador enseña el destino abajo a la izquierda al pasar por encima. Nada de eso se puede reimplementar sobre un <button>.
Destino externo, y qué pasa con la pestaña nuevaEl componente no decide abrir en otra pestaña porque el destino sea externo — los dos primeros van al mismo sitio y solo el segundo lleva newTab. Abrir una pestaña le quita al usuario el botón Atrás, y NN/g es explícito: «For the most part, always open links in the same browser tab or window». WCAG lo cataloga como cambio de contexto (SC 3.2.5), pero es AAA: recomendación, no obligación de AA. Así que lo decide el sitio de llamada.
Cuando SÍ se abre, el componente pone rel="noopener noreferrer" él mismo. noopener ya es redundante en la especificación — target="_blank" lo implica desde whatwg/html#4330 (Chrome 88, Firefox 79, Safari 12.1)— y se escribe igual porque es gratis. El que gana su sitio es noreferrer: sin él, el destino recibe la cabecera Referer con la ruta interna completa de un portal de staff, query incluida.
🔊 Enciende el lector de pantalla sobre el segundo: se anuncia «Docs (opens in a new tab), enlace». El icono no basta — la técnica G201 pide el aviso en el propio enlace, y un SVG sin alternativa es contenido no textual sin equivalente (SC 1.1.1, nivel A). Así que el icono va aria-hidden y el aviso viaja en un sr-only. De los cuatro sistemas que se revisaron en su código publicado —Carbon, Polaris, Primer, Spectrum— ninguno añade ese texto: esto es G201 aplicada, no «lo que hace todo el mundo».