# Heading (/components/typography/heading)



`Heading` renders a semantic section heading. It reads its level from `HeadingLevels` context. Set
`level` to override it directly.

apps/docs/src/examples/heading/basic.tsx

```tsx
import { Heading } from '@luke-ui/react/heading';

export default () => {
	return <Heading level={2}>Section heading</Heading>;
};
```

## Heading level [#heading-level]

Set `base` on the root `HeadingLevels`. Each nested `HeadingLevels` advances the next heading level.
This keeps the document outline aligned with the component structure.

apps/docs/src/examples/heading/automatic-leveling.tsx

```tsx
import { Box } from '@luke-ui/react/box';
import { Heading, HeadingLevels } from '@luke-ui/react/heading';

export default () => {
	return (
		<HeadingLevels base={1}>
			<Box display="flex" flexDirection="column" gap="sp12">
				<Heading>Top-level heading (h1)</Heading>
				<HeadingLevels>
					<Heading>Nested heading (h2)</Heading>
					<HeadingLevels>
						<Heading>Nested again (h3)</Heading>
					</HeadingLevels>
				</HeadingLevels>
			</Box>
		</HeadingLevels>
	);
};
```

Use `level` to override the context for one heading. It does not change the level for siblings or
children.

```tsx
<Heading level={2}>Explicit h2</Heading>
```

To read the current level in a custom heading-like component, use `useHeadingLevel`. Unlike a nested
`HeadingLevels`, it does not advance the level.

Do not skip levels, such as an h2 followed by an h4. Someone who uses a screen reader navigates a
page by heading level.

## Typography [#typography]

By default, `Heading` maps h1–h4 to `heading1`–`heading4`, h5 to `lead`, and h6 to `body`, and uses
the `heading` font-weight role. Set `typography` to change the visual style without changing the
semantic level. Use `display` for oversized marketing-style headings.

apps/docs/src/examples/heading/typography.tsx

```tsx
import { Heading } from '@luke-ui/react/heading';
import { Comparison, ComparisonItem } from '#docs/comparison';

export default () => {
	return (
		<Comparison direction="vertical">
			<ComparisonItem label="body">
				<Heading level={2} typography="body">
					Example heading
				</Heading>
			</ComparisonItem>
			<ComparisonItem label="lead">
				<Heading level={2} typography="lead">
					Example heading
				</Heading>
			</ComparisonItem>
			<ComparisonItem label="heading4">
				<Heading level={2} typography="heading4">
					Example heading
				</Heading>
			</ComparisonItem>
			<ComparisonItem label="heading3">
				<Heading level={2} typography="heading3">
					Example heading
				</Heading>
			</ComparisonItem>
			<ComparisonItem label="heading2">
				<Heading level={2} typography="heading2">
					Example heading
				</Heading>
			</ComparisonItem>
			<ComparisonItem label="heading1">
				<Heading level={2} typography="heading1">
					Example heading
				</Heading>
			</ComparisonItem>
			<ComparisonItem label="display">
				<Heading level={2} typography="display">
					Example heading
				</Heading>
			</ComparisonItem>
		</Comparison>
	);
};
```

## Related components [#related-components]

Use [Text](/components/typography/text) for prominent content that is not a section heading.

## API [#api]

### HeadingProps [#headingprops]

<ComponentPropsTable
  id="type-table-heading.tsx-HeadingProps"
  type="{
  &#x22;id&#x22;: &#x22;heading.tsx-HeadingProps&#x22;,
  &#x22;name&#x22;: &#x22;HeadingProps&#x22;,
  &#x22;description&#x22;: &#x22;Props for `Heading`.&#x22;,
  &#x22;entries&#x22;: [
    {
      &#x22;name&#x22;: &#x22;level&#x22;,
      &#x22;description&#x22;: &#x22;Heading level override. Inherits from context when omitted.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;HeadingLevel | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;render&#x22;,
      &#x22;description&#x22;: &#x22;Overrides the default DOM element with a custom render function.\nThis allows rendering existing components with built-in styles and behaviors\nsuch as router links, animation libraries, and pre-styled components.\n\nRequirements:\n\n- You must render the expected element type (e.g. if `<button>` is expected, you cannot render an\n  `<a>`).\n- Only a single root DOM element can be rendered (no fragments).\n- You must pass through props and ref to the underlying DOM element, merging with your own prop\n  as appropriate.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;DOMRenderFunction<any, any> | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;DOMRenderFunction<any, any>&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;color&#x22;,
      &#x22;description&#x22;: &#x22;Sets text colour.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;'primary'&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;\&#x22;accent\&#x22; | \&#x22;info\&#x22; | \&#x22;success\&#x22; | \&#x22;warning\&#x22; | \&#x22;danger\&#x22; | \&#x22;primary\&#x22; | \&#x22;secondary\&#x22; | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;fontStyle&#x22;,
      &#x22;description&#x22;: &#x22;Sets font style.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;'default'&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;\&#x22;inherit\&#x22; | \&#x22;normal\&#x22; | \&#x22;default\&#x22; | \&#x22;italic\&#x22; | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;fontVariantNumeric&#x22;,
      &#x22;description&#x22;: &#x22;Sets numeric glyph style.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;'default'&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;\&#x22;normal\&#x22; | \&#x22;default\&#x22; | \&#x22;diagonal-fractions\&#x22; | \&#x22;ordinal\&#x22; | \&#x22;slashed-zero\&#x22; | \&#x22;tabular-nums\&#x22; | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;fontWeight&#x22;,
      &#x22;description&#x22;: &#x22;Sets the semantic font-weight role. When omitted, the selected typography style supplies its\nweight.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;\&#x22;heading\&#x22; | \&#x22;label\&#x22; | \&#x22;body\&#x22; | \&#x22;emphasis\&#x22; | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;isVisuallyHidden&#x22;,
      &#x22;description&#x22;: &#x22;Hides text visually while keeping it accessible.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;false&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;boolean | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;lineClamp&#x22;,
      &#x22;description&#x22;: &#x22;Clamps text lines. `true` clamps to 1 line; numeric values clamp to 1–5.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;boolean | 1 | 2 | 3 | 4 | 5 | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;shouldDisableTrim&#x22;,
      &#x22;description&#x22;: &#x22;Turns cap-height trim on or off. When omitted, trimming is disabled for inline or unknown\nelement types. Line clamp always disables trim.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;boolean | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;shouldInheritFont&#x22;,
      &#x22;description&#x22;: &#x22;Makes text inherit its surrounding font and colour styles.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;false&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;boolean | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;textAlign&#x22;,
      &#x22;description&#x22;: &#x22;Sets text alignment.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;'start'&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;\&#x22;center\&#x22; | \&#x22;end\&#x22; | \&#x22;start\&#x22; | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;textDecoration&#x22;,
      &#x22;description&#x22;: &#x22;Sets text decoration.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;'none'&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;\&#x22;none\&#x22; | \&#x22;inherit\&#x22; | \&#x22;line-through\&#x22; | \&#x22;underline\&#x22; | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;textTransform&#x22;,
      &#x22;description&#x22;: &#x22;Sets text transform.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;'none'&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;\&#x22;none\&#x22; | \&#x22;inherit\&#x22; | \&#x22;default\&#x22; | \&#x22;capitalize\&#x22; | \&#x22;lowercase\&#x22; | \&#x22;uppercase\&#x22; | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;textWrap&#x22;,
      &#x22;description&#x22;: &#x22;Sets text wrapping behavior.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;'default'&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;\&#x22;balance\&#x22; | \&#x22;default\&#x22; | \&#x22;pretty\&#x22; | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;typography&#x22;,
      &#x22;description&#x22;: &#x22;Applies a complete typography style: family, size, weight, line height, letter spacing, and\ntrim.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;'body'&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;\&#x22;caption\&#x22; | \&#x22;label\&#x22; | \&#x22;body\&#x22; | \&#x22;lead\&#x22; | \&#x22;heading4\&#x22; | \&#x22;heading3\&#x22; | \&#x22;heading2\&#x22; | \&#x22;heading1\&#x22; | \&#x22;display\&#x22; | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;elementType&#x22;,
      &#x22;description&#x22;: &#x22;Renders a different element type in place of the default. Use it to choose a semantic element\nwithout changing the visual or accessibility treatment.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;string | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;string&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;deprecated&#x22;: false,
      &#x22;description&#x22;: &#x22;`HeadingProps` also accepts compatible DOM and ARIA attributes and event handlers for its rendered element.&#x22;,
      &#x22;name&#x22;: &#x22;__nativePropsForwarding&#x22;,
      &#x22;required&#x22;: true,
      &#x22;simplifiedType&#x22;: &#x22;&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;&#x22;
    }
  ]
}"
/>

### HeadingLevelsProps [#headinglevelsprops]

<ComponentPropsTable
  id="type-table-heading-context.tsx-HeadingLevelsProps"
  type="{
  &#x22;id&#x22;: &#x22;heading-context.tsx-HeadingLevelsProps&#x22;,
  &#x22;name&#x22;: &#x22;HeadingLevelsProps&#x22;,
  &#x22;description&#x22;: &#x22;&#x22;,
  &#x22;entries&#x22;: [
    {
      &#x22;name&#x22;: &#x22;base&#x22;,
      &#x22;description&#x22;: &#x22;Base level override. Defaults to inherited level + 1.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;HeadingLevel | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;children&#x22;,
      &#x22;description&#x22;: &#x22;&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;ReactNode | ((props: HeadingLevelsRenderProps) => ReactNode)&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: true,
      &#x22;deprecated&#x22;: false
    }
  ]
}"
/>

### HeadingLevelsRenderProps [#headinglevelsrenderprops]

<ComponentPropsTable
  id="type-table-heading-context.tsx-HeadingLevelsRenderProps"
  type="{
  &#x22;id&#x22;: &#x22;heading-context.tsx-HeadingLevelsRenderProps&#x22;,
  &#x22;name&#x22;: &#x22;HeadingLevelsRenderProps&#x22;,
  &#x22;description&#x22;: &#x22;Values returned when resolving heading level from context.&#x22;,
  &#x22;entries&#x22;: [
    {
      &#x22;name&#x22;: &#x22;element&#x22;,
      &#x22;description&#x22;: &#x22;&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;\&#x22;h1\&#x22; | \&#x22;h2\&#x22; | \&#x22;h3\&#x22; | \&#x22;h4\&#x22; | \&#x22;h5\&#x22; | \&#x22;h6\&#x22;&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: true,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;level&#x22;,
      &#x22;description&#x22;: &#x22;&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;HeadingLevel&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;HeadingLevel&#x22;,
      &#x22;required&#x22;: true,
      &#x22;deprecated&#x22;: false
    }
  ]
}"
/>
