You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The bar that appears below the navbar under the lg breakpoint is marked up as a nav, so it becomes a navigation landmark. It holds the sidebar toggle button,
the page title or the breadcrumbs, and the search button. In neither
configuration does the nav itself hold a navigation link.
With breadcrumbs on (the default), every link is inside a nested nav.quarto-page-breadcrumbs, which is its own landmark. The postprocessor
swaps it in for the title element:
So the landmark holds a button, a heading, and another landmark.
The strip only exists below lg, and the sidebar it toggles is a collapse that
sits under it, so both are in the accessibility tree together when a reader opens
the sidebar:
This surfaced in review of #14813, which gives every nav landmark a distinct aria-label. Naming this one is hard because there is no honest navigation word
for it. The label there is Toolbar, which a screen reader announces as
"Toolbar, navigation".
axe does not flag this. landmark-unique only requires that the labels differ,
which #14813 satisfies. This is a markup question, not a rule violation.
Suggested fix
Change the nav to a div and drop its aria-label. The nested breadcrumbs nav keeps its own landmark and label, so the only difference for a reader is
that the Toolbar entry drops out of the landmark list. Nothing else moves, and
no links become unreachable.
Points to check:
Most CSS selectors are class based (.quarto-secondary-nav), but four rules
use the element selector nav.quarto-secondary-nav and need updating.
With breadcrumbs: false the bar then holds no landmark at all. Make sure the
page title inside it is still reachable.
The bar that appears below the navbar under the
lgbreakpoint is marked up as anav, so it becomes a navigation landmark. It holds the sidebar toggle button,the page title or the breadcrumbs, and the search button. In neither
configuration does the
navitself hold a navigation link.quarto-cli/src/resources/projects/website/templates/nav-before-body.ejs
Lines 63 to 89 in 093316c
nav.quarto-page-breadcrumbs, which is its own landmark. The postprocessorswaps it in for the title element:
quarto-cli/src/project/types/website/website-navigation.ts
Lines 470 to 482 in 093316c
breadcrumbs: falsethere are no links at all. The<a>at L74 and L78has no
href. It is a Bootstrap collapse trigger, and Make website sidebar section toggles keyboard-operable buttons #14826 already removedthe
role="navigation"androle="link"it used to carry.So the landmark holds a button, a heading, and another landmark.
The strip only exists below
lg, and the sidebar it toggles is a collapse thatsits under it, so both are in the accessibility tree together when a reader opens
the sidebar:
quarto-cli/src/resources/projects/website/navigation/quarto-nav.scss
Lines 454 to 493 in 093316c
This surfaced in review of #14813, which gives every
navlandmark a distinctaria-label. Naming this one is hard because there is no honest navigation wordfor it. The label there is
Toolbar, which a screen reader announces as"Toolbar, navigation".
axe does not flag this.
landmark-uniqueonly requires that the labels differ,which #14813 satisfies. This is a markup question, not a rule violation.
Suggested fix
Change the
navto adivand drop itsaria-label. The nested breadcrumbsnavkeeps its own landmark and label, so the only difference for a reader isthat the
Toolbarentry drops out of the landmark list. Nothing else moves, andno links become unreachable.
Points to check:
.quarto-secondary-nav), but four rulesuse the element selector
nav.quarto-secondary-navand need updating.breadcrumbs: falsethe bar then holds no landmark at all. Make sure thepage title inside it is still reachable.
navigation-toolbar-labellanguage key added by Give every website and booknavlandmark a distinct, localizable label #14813 becomes unused. Itships in
_language.ymland in all 33 translated files, so remove it before1.11 is released rather than after.
Split from #14813. Part of #8706.
Investigated with AI (Claude Code), grounded in a local clone.