` could be reused everywhere. No browser or screen reader ever implemented it, nesting multiple ``s that way is now non-conforming, and the browser default that shrank a sectioned `` was removed from the spec in 2025. Use a single `` that matches the page title.
- **Do not skip levels.** Go `h1 → h2 → h3`, never `h1 → h3`. Levels can decrease by any amount on the way back up (`h3 → h2` is fine).
- **Headings describe sections, not styling.** If you want bigger text, use CSS. Never pick a heading level for its font size.
- **No heading without a section under it.** Every heading should have content. An `` followed immediately by another `` with nothing between them is a smell.
- **Keep headings short.** They are anchors, not paragraphs. Aim for under 70 characters.
- **Distinguish sibling headings.** The same heading text under different parent sections ("Overview", "Examples") is fine, because the rotor shows each nested under its parent. Two headings with identical text in the same branch are the confusing case; disambiguate those.
- **A title and its subtitle are one heading, not two.** Marking up a strapline as a second heading (`` followed by an `` tagline) adds a phantom level to the outline. Wrap the single ``–`` and one or more `
` was removed from the spec in 2025. Use a single `` that matches the page title.
- **Do not skip levels.** Go `h1 → h2 → h3`, never `h1 → h3`. Levels can decrease by any amount on the way back up (`h3 → h2` is fine).
- **Headings describe sections, not styling.** If you want bigger text, use CSS. Never pick a heading level for its font size.
- **No heading without a section under it.** Every heading should have content. An `` followed immediately by another `` with nothing between them is a smell.
- **Keep headings short.** They are anchors, not paragraphs. Aim for under 70 characters.
- **Distinguish sibling headings.** The same heading text under different parent sections ("Overview", "Examples") is fine, because the rotor shows each nested under its parent. Two headings with identical text in the same branch are the confusing case; disambiguate those.
- **A title and its subtitle are one heading, not two.** Marking up a strapline as a second heading (`` followed by an `` tagline) adds a phantom level to the outline. Wrap the single ``–`` and one or more `
` followed immediately by another `` with nothing between them is a smell.
- **Keep headings short.** They are anchors, not paragraphs. Aim for under 70 characters.
- **Distinguish sibling headings.** The same heading text under different parent sections ("Overview", "Examples") is fine, because the rotor shows each nested under its parent. Two headings with identical text in the same branch are the confusing case; disambiguate those.
- **A title and its subtitle are one heading, not two.** Marking up a strapline as a second heading (`` followed by an `` tagline) adds a phantom level to the outline. Wrap the single ``–`` and one or more `
` followed by an `` tagline) adds a phantom level to the outline. Wrap the single ``–`` and one or more `
`–`` and one or more `
` subtitles in ``, which groups them without contributing a heading of its own.
- **Visual headings need real heading tags.** A ` ` styled to look like an `` is invisible to search engines.
For component-driven design systems, expose the heading level as a prop (`
` per section because a designer wanted "big titles everywhere".
- Wrapping the site logo in `
` on every page, so every page has the same H1.
- Skipping levels to get a smaller default size (use CSS).
- Hiding headings visually but leaving them in the DOM as the only outline — fine if intentional, broken if it becomes a maintenance burden.
- Putting interactive elements inside headings (buttons, dropdowns). Keep headings text-only.
## Verification
- Use the browser dev tools accessibility panel to view the heading outline.
- Run an automated check (axe, Lighthouse, WAVE). Skipped levels and empty headings are flagged immediately.
- Tab through the page with a screen reader's heading shortcut (`H` in NVDA, `VO+Cmd+H` in VoiceOver). Does the outline read like a table of contents?