Skip to content
Domphy

Visually Hidden

Visually hides an element while keeping it in the accessibility tree — the classic "sr-only" recipe for screen-reader-only labels, live-region text, and skip links (before focus). Styles the host only; apply to any element. visuallyHidden() takes no props.

import { visuallyHidden } from "@domphy/ui"

{ span: "Opens in a new tab", $: [visuallyHidden()] }

Use it when the visible UI already conveys the meaning (an icon-only button, decorative letter-split text) but assistive technology still needs the words.

Customization

Must see the source of patch at the bottom of each patch page to understand the structure then code it still code as html native element.

There are four levels of customization, in increasing order of effort:

  1. Patch props. Each patch exposes a small, stable set of props—typically fewer than five. Lowest friction.
  2. Context attributes. Use dataTone, dataSize, and dataDensity on a container to shift tone, size, or density for an entire subtree without touching individual elements.
  3. Inline override. Native-wins merge strategy: any property set directly on the element overrides the patch value.
  4. Create a variant. Clone a similar patch and edit it. Use this only when you need a reusable custom version.
Formulas

Unit - U = fontSize / 4 - convert final values with themeSpacing(n).

Size - n = intrinsic text lines, w = wrapping level, d = density factor:

height        = (n * 6 + 2 * d * w) * U
paddingBlock  = d * w * U
paddingInline = ceil(3 / w) * d * w * U
radius        = d * w * U

Base density d = 1.5:

Uw=0w=1w=2w=3
height (n = 1)691215
paddingBlock01.534.5
paddingInline34.564.5
radius01.534.5

Tone - K = N / 2 where N is the palette length. For N = 18, K = 9.

RoleShiftn=0
Backgroundparent +/- n0
Textbg + K6
Borderbg + K/23
Hoverbg + 2K/34
Selected / Focusabove +/- K/32-4

State shift range: K/3 <= delta <= 2K/3.

import type { PartialElement } from "@domphy/core";

/**
 * Visually hides an element while keeping it in the accessibility tree — the
 * classic "sr-only" recipe for screen-reader-only labels, live-region text,
 * and skip links (before focus). Styles the host only; apply to any element.
 *
 * @example { span: "Opens in a new tab", $: [visuallyHidden()] }
 */
function visuallyHidden(): PartialElement {
  return {
    style: {
      position: "absolute",
      width: "1px",
      height: "1px",
      padding: "0",
      margin: "-1px",
      overflow: "hidden",
      clip: "rect(0, 0, 0, 0)",
      whiteSpace: "nowrap",
      border: "0",
    },
  };
}

export { visuallyHidden };