Usage
aria-hidden:
as picks span (default) for a run inside a sentence, or div for a hidden block, such as a heading above an icon-only region:
as never changes the hiding CSS. Both hosts get the same fixed clip-and-offset box.
className and no style, so its hiding CSS cannot be overridden or partially disabled. It is not an interaction target: it forwards no on* handler and takes no tabIndex. It also excludes aria-hidden, hidden, inert, and role (Decision VH-7): any of the first three would remove the element from the accessibility tree, silently defeating the whole point of the primitive; for example an icon-only button whose name comes from <VisuallyHidden aria-hidden="true"> would lose its accessible name with no warning (WCAG 4.1.2). role is excluded so a caller cannot swap in different assistive-technology semantics; and because role is fixed, the host is always the implicit ARIA role generic, which ARIA 1.2 does not let anyone give an accessible name; so aria-label and aria-labelledby are excluded too. All six are declared as never, not merely omitted, so passing a value to any of them is a real JSX type error, not just a missing-prop one. In development, dropping aria-hidden, hidden, inert, or role at runtime (for example a value cast in past the type system) also warns once each; aria-label/aria-labelledby are dropped silently, the same as every other excluded prop.
Everything else passes through unfiltered: id, lang, dir, aria-live, aria-describedby, every other ARIA attribute, and data-* (other than a reserved design-system state name, dropped the same way Box drops one). To name a region that VisuallyHidden supplies the label text for, point aria-labelledby at VisuallyHidden's id from the other element; the AsDivLabelsARegion story shows this; not on VisuallyHidden itself.
In development, VisuallyHidden warns once (through warnOnce) when it finds a focusable descendant: a link or area with href, an enabled form control (a disabled one, or input type="hidden", does not count), summary, iframe, a video or audio with controls, or an element with tabIndex >= 0 or an editable contentEditable value. The walk looks through any wrapping component, not only plain HTML elements, so <VisuallyHidden><Box><button/></Box></VisuallyHidden> still warns. Hiding a focusable element still leaves a tab stop with no visible focus indicator, which traps keyboard users. Render the control visibly instead of hiding it. The warning does not throw and does not change what renders; it is a build-time signal, not runtime behavior.
VisuallyHidden hides content permanently. A skip link needs to become visible on focus, which is a separate, later primitive; do not reach for VisuallyHidden to build one.