a11y: margin citations have `role="listitem"` with no `role="list"` parent
まだ誰も着手していません。
評価
- 難易度
- 2/5
- 見積もり時間
- 1〜3時間
- 初心者へのやさしさ
- 82/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 静か
- 技術スタック
- html, typescript
調査の方向性
src/format/html/format-html-bootstrap.ts から始め、特に referenceMarginProcessor と div#refs を削除するコードを確認します。提供された reprex を quarto render reprex.qmd でレンダリングし、生成された HTML と axe レポートを調べ、移動された引用が有効な ARIA リストセマンティクスを持ち、aria-required-parent 違反がないことを確認します。
索引モデルが issue の本文から書いたものです。
説明
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
With citation-location: margin, HTML output contains bibliography entries with role="listitem" but no role="list" ancestor. ARIA requires that listitem is contained by a list parent. axe-core reports this as aria-required-parent (critical impact, WCAG 2.0 A, SC 1.3.1 Info and Relationships).
The cause is in the margin relocation, not in the bibliography markup:
- Pandoc's citeproc emits valid markup:
<div id="refs" class="csl-bib-body" role="list">wraps each<div class="csl-entry" role="listitem">. referenceMarginProcessorcopies eachcsl-entryinto a new plain<div class="no-row-height column-margin column-container">next to its citation.- Quarto then removes
div#refs, so norole="list"element remains in the page.
Effect on assistive technology. The margin placement is CSS-only, so in DOM order the relocated entry directly follows the sentence that contains the citation. A screen reader reads the entry at that point, so the content is reachable. But the orphaned role="listitem" makes the announcement unpredictable: screen readers differ on whether to announce a list item, and there is no list context to announce. The citation link (role="doc-biblioref") points to a plain <div> that is not focusable, so the link does not move keyboard focus. This describes the rendered markup — we did not test specific screen readers.
Until this is fixed, the accessible choice is to not set citation-location: margin. The default (citation-location: document) keeps the bibliography as a valid role="list".
The problem is visible on quarto.org: an axe-core 4.10 scan flags #ref-xie2018 on Article Layout.
Note: an AI assistant helped investigate this issue, grounded in a local clone of quarto-cli (per CONTRIBUTING.md, "Using AI tools to investigate").
Steps to reproduce
Render this document with quarto render reprex.qmd:
---
title: "Margin citation reprex"
format:
html:
axe:
output: document
bibliography: refs.bib
citation-location: margin
---
See @xie2018.
with this refs.bib:
@book{xie2018,
title = {R Markdown: The Definitive Guide},
author = {Xie, Yihui and Allaire, J.J. and Grolemund, Garrett},
year = {2018},
publisher = {Chapman and Hall/CRC}
}
Then open reprex.html in a browser. The axe check appends its report to the end of the document.
Actual behavior
The axe report shows one violation:
Critical · WCAG 2.0 A (1.3.1): Ensure elements with an ARIA role that require parent roles are contained by them
Certain ARIA roles must be contained by particular parents
#ref-xie2018
The flagged element and its container in the rendered HTML:
<div class="no-row-height column-margin column-container"><div id="ref-xie2018" class="csl-entry" role="listitem">
Xie, Yihui, J. J. Allaire, and Garrett Grolemund. 2018. <em>R Markdown: The Definitive Guide</em>. Chapman; Hall/CRC.
</div></div>
The page contains one role="listitem" and zero role="list".
Expected behavior
The relocated bibliography entry has valid ARIA list semantics. Either the margin container carries role="list", or the entry does not carry role="listitem". The axe check reports no violation.
Your environment
- IDE: Positron 2026.08.0 build 213 (rendered with Quarto CLI in the terminal)
- OS: macOS 26.5.2 (build 25F84)
Quarto check output
Quarto 1.10.18
[✓] Checking environment information...
Quarto cache location: /Users/charlottewickham/Library/Caches/quarto
[✓] 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.10.18
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/Documents/posit/quarto-web-accessibility-checking-ideas/renv/library/macos/R-4.6/aarch64-apple-darwin23
- /Users/charlottewickham/Library/Caches/org.R-project.R/R/renv/sandbox/macos/R-4.6/aarch64-apple-darwin23/46003b10
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...
- 主要言語
- JavaScript
- スター
- 6k
- フォーク
- 458
- 平均マージ
- 1日 9時間
- マージ済み PR(30日)
- 41
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
quarto-dev/quarto-cli のほかの issue
-
binder bug
難易度 1/5 1時間未満 初心者へのやさしさ 92/100
quarto-dev/quarto-cli#14907 · コメント 3 件 ·
-
brand bug
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
quarto-dev/quarto-cli#14891 ·
-
brand bug html revealjs
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
quarto-dev/quarto-cli#14882 ·
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
quarto-dev/quarto-cli#14875 ·
-
Percent scripts: accept raw-string (r""") and '''-delimited markdown cells, as jupytext writes them オープンengines-jupyter enhancement
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
quarto-dev/quarto-cli#14850 · コメント 2 件 ·
quarto-dev/quarto-cli の issue をすべて見る
似ている issue
-
code-quality refactoring
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
github/gh-aw-firewall#8816 ·
-
integration:quickjs org:external priority:backlog topic:code-interpreter topic:middleware type:feature
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
langchain-ai/deepagents#6450 ·
-
optimization optimization:agents-md-curator
難易度 2/5 1〜3時間 初心者へのやさしさ 86/100
githubnext/gh-aw-cao#13143 ·
-
status: needs triage
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100