Navbar dropdown toggles have `role="link"`
Maintainers usually reply within 1 day
@Mittalnew is already working on this.
Since Oct 26, 2026.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 88/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- bootstrap, html, javascript, playwright
- Domain
- accessibility, frontend
Research direction
Read the three templates named in the report: src/resources/projects/website/templates/navitem.ejs, navitem-dropdown.ejs, and navtools.ejs. Check how each dropdown toggle sets its role and compare the rendered accessibility tree with the reported expected button role. Done when all three toggles expose the button role while retaining the expanded state; the issue gives a navbar configuration to render and verify.
Written by the indexing model from the issue text.
Description
I have:
- searched the issue tracker for similar issues
- installed the latest version of Quarto CLI
- formatted my issue following the Bug Reports guide
Bug description
Navbar menus (menu: on a nav item or a navbar tool) open with a toggle that has role="link". Screen readers announce the toggle as a link. But the control opens a menu and does not go to a page. This fails WCAG 4.1.2 Name, Role, Value (Level A).
Three templates write the role (navitem.ejs#L9, navitem-dropdown.ejs#L9, navtools.ejs#L29):
<a class="nav-link dropdown-toggle" href="#" id="nav-menu-guides" role="link"
data-bs-toggle="dropdown" aria-expanded="false">
Commit 9143e2cab (1.5) changed role="menu" to role="link", to remove a Lighthouse warning about aria-expanded. role="menu" was also wrong, but role="button" is correct here. Bootstrap's navbar dropdown example uses role="button", and aria-expanded is valid on a button.
A possible fix: change role="link" to role="button" in the three templates. A <button> element is also correct, but it changes more CSS.
This was first reported in a comment on discussion #12644, tested with NVDA and JAWS.
Investigated with AI assistance, grounded in a local clone of quarto-cli.
Steps to reproduce
_quarto.yml:
project:
type: website
website:
navbar:
left:
- text: Guides
menu:
- text: One
href: index.qmd
- text: Two
href: index.qmd
index.qmd:
---
title: Home
---
Text.
- Render the site and open
_site/index.html. - Move to "Guides" with a screen reader, or examine it in the browser accessibility tree.
- Press Enter.
Actual behavior
- The accessibility tree shows
link "Guides"with URL#. - Enter opens the menu (
aria-expandedchanges totrue). The page does not change.
Tested in Chromium with Playwright.
Expected behavior
The toggle has the button role, for example "Guides, button, collapsed". The aria-expanded state is announced with it.
Your environment
- IDE: none (rendered with the CLI)
- OS: macOS 27.0.1 (build 26A434)
Quarto check output
Quarto 1.11.6
[✓] Checking environment information...
Quarto cache location: /Users/charlottewickham/Library/Caches/quarto
Project: none found (single-file mode)
[✓] Checking versions of quarto binary dependencies...
Pandoc version 3.10.0: OK
Dart Sass version 1.101.0: OK
Deno version 2.7.14: OK
Typst version 0.15.1: OK
[✓] Checking versions of quarto dependencies......OK
[✓] Checking Quarto installation......OK
Version: 1.11.6
Path: /Applications/quarto/bin
[✓] Checking tools....................OK
TinyTeX: v2026.04
Chrome Headless Shell: 150.0.7871.115
VeraPDF: 1.28.2
[✓] Checking LaTeX....................OK
Using: TinyTex
Path: /Users/charlottewickham/Library/TinyTeX/bin/universal-darwin
Version: 2026
[✓] Checking Chrome Headless....................OK
Using: Chrome Headless Shell installed by Quarto
Path: /Users/charlottewickham/Library/Application Support/quarto/chrome-headless-shell/chrome-headless-shell-mac-arm64/chrome-headless-shell
Version: 150.0.7871.115
[✓] Checking basic markdown render....OK
[✓] Checking R installation...........OK
Version: 4.6.0
Path: /Library/Frameworks/R.framework/Versions/4.6/Resources
LibPaths:
- /Users/charlottewickham/Library/R/arm64/4.6/library
- /Library/Frameworks/R.framework/Versions/4.6/Resources/library
knitr: 1.51
rmarkdown: 2.31
[✓] Checking Knitr engine render......OK
[✓] Checking Python 3 installation....OK
Version: 3.12.2
Path: /Users/charlottewickham/.pyenv/versions/3.12.2/bin/python3
Jupyter: 5.9.1
Kernels: python3
[✓] Checking Jupyter engine render....OK
[✓] Checking Julia installation...
- Dominant language
- JavaScript
- Stars
- 6.1k
- Forks
- 471
- Avg merge
- 16h 57m
- Merged PRs (30d)
- 102
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from quarto-dev/quarto-cli
-
accessibility bug website-navigation
Difficulty 2/5 1-3 hours Newbie friendliness 83/100
quarto-dev/quarto-cli#15190 ·
Maintainers usually reply within 1 day
-
accessibility bug html websites
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
quarto-dev/quarto-cli#15187 ·
Maintainers usually reply within 1 day
-
enhancement themes websites
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
quarto-dev/quarto-cli#15179 ·
Maintainers usually reply within 1 day
-
about-page bug layout websites
Difficulty 1/5 1-3 hours Newbie friendliness 82/100
quarto-dev/quarto-cli#15178 ·
Maintainers usually reply within 1 day
-
Website projects ignore `$border-color` and `$border-radius` defaults because of an invalid `scss:variables` boundary in `quarto-listing.scss`Possibly taken @Don-Yin claimed this today. Openbug websites
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
quarto-dev/quarto-cli#15176 ·
Maintainers usually reply within 1 day
All issues in quarto-dev/quarto-cli
Similar issues
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
glossyio/traffic-monitor#255 ·
Maintainers usually reply within 1 day
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
juice-shop/juice-shop#3706 ·
Maintainers usually reply within 1 day
-
Main workflow runs twice for newly created refsPossibly taken @rustyconover claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
duckdb/duckdb-wasm#2293 ·
Maintainers usually reply within 1 day
-
Difficulty 1/5 Under an hour Newbie friendliness 85/100
521xueweihan/HelloGitHub#4115 ·
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
outline/outline#14348 · 1 comment ·
Maintainers usually reply within 1 day