diff --git a/.claude/rules/axe-baseline.md b/.claude/rules/axe-baseline.md new file mode 100644 index 0000000000..e1c3ec1358 --- /dev/null +++ b/.claude/rules/axe-baseline.md @@ -0,0 +1,34 @@ +--- +paths: + - "_axe-baseline.json" +--- + +# Axe baseline + +`quarto call axe` reads `_axe-baseline.json` with a strict schema. Do not add keys that the schema does not allow, for example comments. + +## Notes + +Write each `note` in this format: + +``` +: . . +``` + +- `` is `upstream`, `third-party`, `false-positive`, or `intentional`. +- For `third-party`, put the library name after the type: `third-party: Observable Plot, observablehq/plot#2018.` +- Write every issue reference as `org/repo#number`, also inside the description. Do not write `quarto-cli#123` or `#123`. +- If no issue exists, write `no upstream issue` in place of the reference. +- Do not put the description in parentheses. +- Do not use Markdown links or URLs. An extension makes links from the `org/repo#number` text. +- Give the cause and the condition to remove the entry. Do not add commentary, for example "open since 2023" or "by design, not oversight". +- If the entry is limited to some pages, give the reason: the signature that also matches content that quarto-web can fix. + +## Pages + +- Use `"pages": []` (all pages) only when the selector matches nothing but the third-party or Quarto markup. +- If the selector is generic, for example `pre`, `th`, `a`, or `.collapsed`, list the pages. + +## Order + +The scanner does not use the order of the entries. For human readers, keep entries grouped by owner, in the order: upstream Quarto by issue, then reveal.js, then each third-party library, then false positives, then intentional examples. diff --git a/README.md b/README.md index 3a6df20d64..7a4f6724f5 100644 --- a/README.md +++ b/README.md @@ -187,6 +187,22 @@ quarto preview --profile prerelease,prerelease-docs Our GitHub Action workflows are documented in [`.github/workflows/README.md`](.github/workflows/README.md) +## Accessibility baseline + +`_axe-baseline.json` lists the accessibility findings that `quarto call axe` reports as known, not new. Each entry is a finding that quarto-web cannot fix in its own content, a false positive, or an intentional example. + +Each entry has a `note` in this format: + +``` +: . . +``` + +- `` is `upstream`, `third-party`, `false-positive`, or `intentional`. For `third-party`, add the library name: `third-party: leaflet, .` +- `` is a full `org/repo#number` reference, for example `quarto-dev/quarto-cli#14378`. If no issue exists, write `no upstream issue`. +- The description gives the cause and the condition to remove the entry. If the entry is limited to some pages, it also gives the reason. + +Do not use Markdown links in a note. Do not add commentary, for example the age of an issue. + ## Style Guide You can find some style guidance in [_style-guide.md](_style-guide.md). diff --git a/_axe-baseline.json b/_axe-baseline.json new file mode 100644 index 0000000000..c3755d185d --- /dev/null +++ b/_axe-baseline.json @@ -0,0 +1,773 @@ +{ + "signatureScheme": 1, + "findings": [ + { + "signature": "scrollable-region-focusable :: #cb", + "pages": [], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: .code-with-filename > .code-with-filename-file > pre", + "pages": ["docs/extensions/brand.html", "docs/extensions/filters.html", "docs/extensions/formats.html", "docs/extensions/revealjs.html", "docs/extensions/shortcodes.html", "docs/journals/formats.html", "docs/websites/website-drafts.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: pre", + "pages": ["docs/computations/julia.html", "docs/interactive/ojs/libraries.html", "docs/output-formats/html-themes-more.html", "docs/prerelease/1.4/crossref.html", "docs/publishing/confluence.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #publish-action > .code-with-filename > .code-with-filename-file > pre", + "pages": ["docs/publishing/github-pages.html", "docs/publishing/netlify.html", "docs/publishing/quarto-pub.html", "docs/publishing/rstudio-connect.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #example-jupyter-with-venv > .code-with-filename > .code-with-filename-file > pre", + "pages": ["docs/publishing/github-pages.html", "docs/publishing/netlify.html", "docs/publishing/quarto-pub.html", "docs/publishing/rstudio-connect.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #example-knitr-with-renv > .code-with-filename > .code-with-filename-file > pre", + "pages": ["docs/publishing/github-pages.html", "docs/publishing/netlify.html", "docs/publishing/quarto-pub.html", "docs/publishing/rstudio-connect.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: .cell > .cell-output-stderr.cell-output > pre", + "pages": ["docs/authoring/penguins-qmd.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #missing-fonts-in-typst > pre", + "pages": ["docs/advanced/typst/brand-yaml.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: .column-page.cell-output-display", + "pages": ["docs/authoring/article-layout.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #multiple-outputs > .cell.page-full.page-columns > .cell-output-display", + "pages": ["docs/authoring/article-layout.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #previewing-changes > pre", + "pages": ["docs/authoring/brand.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #graphviz > .cell[data-layout-align=\"default\"] > .cell-output-display", + "pages": ["docs/authoring/diagrams.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: .cell-output-stderr.cell-output > pre", + "pages": ["docs/authoring/penguins-qmd.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #status > pre", + "pages": ["docs/computations/julia.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #close > pre", + "pages": ["docs/computations/julia.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #stop > pre", + "pages": ["docs/computations/julia.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #contents-of-brand-extensions > .code-with-filename > .code-with-filename-file > pre", + "pages": ["docs/extensions/brand.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #contents-of-engine-extensions > .code-with-filename > .code-with-filename-file > pre", + "pages": ["docs/extensions/engine.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #overview > pre", + "pages": ["docs/extensions/filters.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #contents-of-metadata-extensions > .code-with-filename > .code-with-filename-file > pre", + "pages": ["docs/extensions/metadata.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #project-type-extension > .code-with-filename > .code-with-filename-file > pre", + "pages": ["docs/extensions/project-types.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #quick-start > .code-with-filename > .code-with-filename-file > pre", + "pages": ["docs/extensions/revealjs.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #example-attribution > .code-with-filename > .code-with-filename-file > pre", + "pages": ["docs/extensions/revealjs.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #running-cells > pre", + "pages": ["docs/get-started/hello/neovim.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: .panel-fill.cell > .cell-output.cell-output-display", + "pages": ["docs/interactive/index.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: .ojs", + "pages": ["docs/interactive/ojs/libraries.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: .cell-output-stderr > pre", + "pages": ["docs/interactive/widgets/htmlwidgets.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #mode-specific-content > pre", + "pages": ["docs/output-formats/html-themes.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #sec-docx-create-template > pre", + "pages": ["docs/output-formats/ms-word-templates.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: .callout-body-container > pre", + "pages": ["docs/prerelease/1.3/tables.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #bootstrap-classes-can-be-added-to-tables > pre", + "pages": ["docs/prerelease/1.3/tables.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #embedded-markdown-content-can-be-specified > pre", + "pages": ["docs/prerelease/1.3/tables.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #selecting-destination > pre", + "pages": ["docs/publishing/confluence.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #publishing-workflow > pre", + "pages": ["docs/publishing/confluence.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #running-code-cells > pre", + "pages": ["docs/tools/neovim.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: #check-the-version-of-quarto-and-its-dependencies > pre", + "pages": ["docs/troubleshooting/index.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "scrollable-region-focusable :: .ejs", + "pages": ["docs/websites/website-listings-custom.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14378. Scrollable code blocks and cell outputs have no tabindex, so keyboard users cannot scroll them. Clears when quarto-dev/quarto-cli#14816 ships." + }, + { + "signature": "aria-allowed-attr :: div[data-bs-target=\".callout-*-contents\"]", + "pages": [], + "impact": "critical", + "note": "upstream: quarto-dev/quarto-cli#4934. Collapsed callouts use a
with aria-expanded instead of the ARIA disclosure pattern." + }, + { + "signature": "aria-allowed-attr :: .collapsed", + "pages": ["docs/get-started/authoring/neovim.html", "docs/get-started/authoring/positron.html", "docs/get-started/authoring/text-editor.html", "docs/get-started/authoring/vscode.html"], + "impact": "critical", + "note": "upstream: quarto-dev/quarto-cli#4934. Collapsed callouts use a
with aria-expanded instead of the ARIA disclosure pattern. Scoped to these pages because .collapsed is the generic Bootstrap collapse class." + }, + { + "signature": "aria-allowed-attr :: .callout-header", + "pages": [], + "impact": "critical", + "note": "upstream: quarto-dev/quarto-cli#4934. Collapsed callouts use a
with aria-expanded instead of the ARIA disclosure pattern." + }, + { + "signature": "image-alt :: p > .img-fluid", + "pages": ["docs/authoring/placeholder.html"], + "impact": "critical", + "note": "upstream: quarto-dev/quarto-cli#14769. The {{< placeholder >}} shortcode makes an with no alt attribute. Scoped to this page because the signature also matches content images with no alt text on other pages." + }, + { + "signature": "image-alt :: .quarto-layout-cell > p > .img-fluid", + "pages": ["docs/authoring/placeholder.html"], + "impact": "critical", + "note": "upstream: quarto-dev/quarto-cli#14769. The {{< placeholder >}} shortcode makes an with no alt attribute. Scoped to this page because the signature also matches content images with no alt text on other pages." + }, + { + "signature": "aria-required-parent :: #ref-xie", + "pages": ["docs/authoring/article-layout.html"], + "impact": "critical", + "note": "upstream: quarto-dev/quarto-cli#14755. Margin citations keep role=\"listitem\", but Quarto removes their role=\"list\" parent when it moves them to the margin." + }, + { + "signature": "frame-title :: #cb > iframe", + "pages": ["docs/presentations/revealjs/advanced.html", "docs/presentations/revealjs/index.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14770. code-preview iframes have no title. Clears when quarto-dev/quarto-cli#14933 ships, because quarto-dev/quarto-web#2220 sets code-preview-title on every preview." + }, + { + "signature": "frame-title :: #cb > .java", + "pages": ["docs/presentations/revealjs/index.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14770. code-preview iframes have no title. Clears when quarto-dev/quarto-cli#14933 ships, because quarto-dev/quarto-web#2220 sets code-preview-title on every preview." + }, + { + "signature": "frame-title :: #cb > .yaml", + "pages": ["docs/presentations/revealjs/index.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14770. code-preview iframes have no title. Clears when quarto-dev/quarto-cli#14933 ships, because quarto-dev/quarto-web#2220 sets code-preview-title on every preview." + }, + { + "signature": "frame-title :: iframe[src$=\"absolute.html\"]", + "pages": ["docs/presentations/revealjs/advanced.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14770. code-preview iframes have no title. Clears when quarto-dev/quarto-cli#14933 ships, because quarto-dev/quarto-web#2220 sets code-preview-title on every preview." + }, + { + "signature": "frame-title :: #cb > iframe[src$=\"stack.html\"]", + "pages": ["docs/presentations/revealjs/advanced.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14770. code-preview iframes have no title. Clears when quarto-dev/quarto-cli#14933 ships, because quarto-dev/quarto-web#2220 sets code-preview-title on every preview." + }, + { + "signature": "frame-title :: iframe[src$=\"auto-animate.html\"]", + "pages": ["docs/presentations/revealjs/advanced.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14770. code-preview iframes have no title. Clears when quarto-dev/quarto-cli#14933 ships, because quarto-dev/quarto-web#2220 sets code-preview-title on every preview." + }, + { + "signature": "frame-title :: iframe[src$=\"fragments.html\"]", + "pages": ["docs/presentations/revealjs/advanced.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14770. code-preview iframes have no title. Clears when quarto-dev/quarto-cli#14933 ships, because quarto-dev/quarto-web#2220 sets code-preview-title on every preview." + }, + { + "signature": "frame-title :: iframe[src$=\"columns.html\"]", + "pages": ["docs/presentations/revealjs/index.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14770. code-preview iframes have no title. Clears when quarto-dev/quarto-cli#14933 ships, because quarto-dev/quarto-web#2220 sets code-preview-title on every preview." + }, + { + "signature": "frame-title :: #cb > iframe[src$=\"smaller.html\"]", + "pages": ["docs/presentations/revealjs/index.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14770. code-preview iframes have no title. Clears when quarto-dev/quarto-cli#14933 ships, because quarto-dev/quarto-web#2220 sets code-preview-title on every preview." + }, + { + "signature": "frame-title :: iframe[src$=\"scrollable.html\"]", + "pages": ["docs/presentations/revealjs/index.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14770. code-preview iframes have no title. Clears when quarto-dev/quarto-cli#14933 ships, because quarto-dev/quarto-web#2220 sets code-preview-title on every preview." + }, + { + "signature": "frame-title :: iframe[src$=\"footer-and-logo.html\"]", + "pages": ["docs/presentations/revealjs/index.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14770. code-preview iframes have no title. Clears when quarto-dev/quarto-cli#14933 ships, because quarto-dev/quarto-web#2220 sets code-preview-title on every preview." + }, + { + "signature": "frame-title :: iframe[src$=\"per-slide-footer.html\"]", + "pages": ["docs/presentations/revealjs/index.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14770. code-preview iframes have no title. Clears when quarto-dev/quarto-cli#14933 ships, because quarto-dev/quarto-web#2220 sets code-preview-title on every preview." + }, + { + "signature": "frame-title :: .python", + "pages": ["docs/presentations/revealjs/index.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14770. code-preview iframes have no title. Clears when quarto-dev/quarto-cli#14933 ships, because quarto-dev/quarto-web#2220 sets code-preview-title on every preview." + }, + { + "signature": "frame-title :: iframe[src$=\"code-echo.html\"]", + "pages": ["docs/presentations/revealjs/index.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14770. code-preview iframes have no title. Clears when quarto-dev/quarto-cli#14933 ships, because quarto-dev/quarto-web#2220 sets code-preview-title on every preview." + }, + { + "signature": "frame-title :: iframe[src$=\"tabset.html\"]", + "pages": ["docs/presentations/revealjs/index.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14770. code-preview iframes have no title. Clears when quarto-dev/quarto-cli#14933 ships, because quarto-dev/quarto-web#2220 sets code-preview-title on every preview." + }, + { + "signature": "frame-title :: iframe[src$=\"background-color.html\"]", + "pages": ["docs/presentations/revealjs/index.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14770. code-preview iframes have no title. Clears when quarto-dev/quarto-cli#14933 ships, because quarto-dev/quarto-web#2220 sets code-preview-title on every preview." + }, + { + "signature": "frame-title :: iframe[src$=\"image-background.html\"]", + "pages": ["docs/presentations/revealjs/index.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14770. code-preview iframes have no title. Clears when quarto-dev/quarto-cli#14933 ships, because quarto-dev/quarto-web#2220 sets code-preview-title on every preview." + }, + { + "signature": "frame-title :: iframe", + "pages": ["docs/authoring/code-annotation.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14770. code-preview iframes have no title. Clears when quarto-dev/quarto-cli#14933 ships, because quarto-dev/quarto-web#2220 sets code-preview-title on every preview." + }, + { + "signature": "meta-viewport :: meta", + "pages": [], + "impact": "critical", + "note": "upstream: quarto-dev/quarto-cli#14952. The revealjs template sets maximum-scale=1.0, user-scalable=no on every deck, so text cannot be resized." + }, + { + "signature": "color-contrast :: #bbbbbb on #ffffff", + "pages": ["docs/presentations/revealjs/examples/line-highlighting-1.html", "docs/presentations/revealjs/examples/line-highlighting-2.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14959. revealjs line highlighting fades the other lines to opacity 0.4. No opacity value meets 4.5:1 and still shows the highlight." + }, + { + "signature": "color-contrast :: #dbbd99 on #ffffff", + "pages": ["docs/presentations/revealjs/examples/line-highlighting-1.html", "docs/presentations/revealjs/examples/line-highlighting-2.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14959. revealjs line highlighting fades the other lines to opacity 0.4. No opacity value meets 4.5:1 and still shows the highlight." + }, + { + "signature": "color-contrast :: #99cc99 on #ffffff", + "pages": ["docs/presentations/revealjs/examples/line-highlighting-2.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14959. revealjs line highlighting fades the other lines to opacity 0.4. No opacity value meets 4.5:1 and still shows the highlight." + }, + { + "signature": "aria-prohibited-attr :: #cb > a[aria-label=\"*\"]", + "pages": ["docs/presentations/revealjs/demo/index.html", "docs/presentations/revealjs/demo/mini/auto-animate-code.html", "docs/presentations/revealjs/examples/line-highlighting-3.html", "docs/presentations/revealjs/examples/line-highlighting-4.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14961. revealjs removes the href from code line-number links, so the aria-label from quarto-dev/quarto-cli#14662 is on an that is not a link. Scoped to these revealjs decks because the signature also matches line numbers on format: html pages and other labeled links." + }, + { + "signature": "aria-prohibited-attr :: a[aria-label=\"*\"]", + "pages": ["docs/presentations/revealjs/examples/code-echo.html", "docs/presentations/revealjs/examples/line-highlighting-1.html", "docs/presentations/revealjs/examples/line-highlighting-2.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14961. revealjs removes the href from code line-number links, so the aria-label from quarto-dev/quarto-cli#14662 is on an that is not a link. Scoped to these revealjs decks because the signature also matches line numbers on format: html pages and other labeled links." + }, + { + "signature": "scrollable-region-focusable :: body", + "pages": ["docs/presentations/revealjs/demo/mini/absolute.html", "docs/presentations/revealjs/demo/mini/auto-animate-movement.html", "docs/presentations/revealjs/demo/mini/auto-animate-stack.html", "docs/presentations/revealjs/demo/mini/auto-animate.html", "docs/presentations/revealjs/demo/mini/fragments-custom.html", "docs/presentations/revealjs/demo/mini/fragments-nested.html", "docs/presentations/revealjs/demo/mini/fragments.html", "docs/presentations/revealjs/demo/mini/stack.html", "docs/presentations/revealjs/demo/mini/zoom.html", "docs/presentations/revealjs/examples/background-color.html", "docs/presentations/revealjs/examples/background-gradient.html", "docs/presentations/revealjs/examples/background-no-title.html", "docs/presentations/revealjs/examples/creating-slides-1.html", "docs/presentations/revealjs/examples/creating-slides-2.html", "docs/presentations/revealjs/examples/creating-slides-3.html", "docs/presentations/revealjs/examples/footer-and-logo.html", "docs/presentations/revealjs/examples/incremental-lists-1.html", "docs/presentations/revealjs/examples/incremental-lists-2.html", "docs/presentations/revealjs/examples/incremental-lists-3.html", "docs/presentations/revealjs/examples/incremental-pause.html", "docs/presentations/revealjs/examples/no-footer-on-a-slide.html", "docs/presentations/revealjs/examples/per-slide-footer.html", "docs/presentations/revealjs/examples/scrollable-and-smaller.html", "docs/presentations/revealjs/examples/scrollable.html", "docs/presentations/revealjs/examples/smaller.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14817. The revealjs template gives slides overflow-y: auto, and the arrow keys move between slides instead of scrolling, so keyboard users cannot reach overflowing content. Flagged at 320px, where reveal.js switches to scroll view; a short viewport also brings back the slide scrollbar. Scoped to these revealjs decks." + }, + { + "signature": "scrollable-region-focusable :: #slide", + "pages": ["docs/presentations/revealjs/examples/scrollable-and-smaller.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14817. The revealjs template gives slides overflow-y: auto, and the arrow keys move between slides instead of scrolling, so keyboard users cannot reach overflowing content. Every slide scrolls here because the deck sets scrollable: true. Scoped to this deck." + }, + { + "signature": "scrollable-region-focusable :: .active-menu-panel", + "pages": ["docs/presentations/revealjs/demo/index.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14817. The revealjs template gives slides overflow-y: auto, and the arrow keys move between slides instead of scrolling, so keyboard users cannot reach overflowing content. Here the scroller is the Slides panel of the slide menu. Scoped to this deck." + }, + { + "signature": "scrollable-region-focusable :: .latex", + "pages": ["docs/presentations/revealjs/demo/index.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14817. The revealjs template gives slides overflow-y: auto, and the arrow keys move between slides instead of scrolling, so keyboard users cannot reach overflowing content. Here it is a code block (.reveal pre code has overflow: auto). Did not reproduce in a local render, so it can disappear from a scan. Scoped to this deck." + }, + { + "signature": "scrollable-region-focusable :: #scrollable-slide", + "pages": ["docs/presentations/revealjs/examples/scrollable.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14817. The revealjs template gives slides overflow-y: auto, and the arrow keys move between slides instead of scrolling, so keyboard users cannot reach overflowing content. Scoped to this deck." + }, + { + "signature": "color-contrast :: #2a76dd on #ffffff", + "pages": ["docs/presentations/revealjs/demo/index.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14962. The default revealjs $link-color #2a76dd is 4.44:1 on #fff, which fails for small text such as the footer link. Flagged only at 320x568; at wider viewports reveal.js scales the slide and axe marks the contrast incomplete. Scoped to the demo deck." + }, + { + "signature": "color-contrast :: #2a76dd on #bbbbbb", + "pages": ["docs/presentations/revealjs/examples/tabset.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14963. Below 30em, the selected revealjs tab has a #bbbbbb fill, so its #2a76dd text is 2.31:1. Scoped to the tabset example." + }, + { + "signature": "link-name :: .slide-menu-button > a", + "pages": [], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14249. The bundled reveal.js-menu plugin makes the menu button an with only an icon, so it has no accessible name. The upstream plugin is archived, so the fix goes into the copy in Quarto. Clears when quarto-dev/quarto-cli#14251 ships." + }, + { + "signature": "tabindex :: #tabby-toggle_tabset", + "pages": ["docs/presentations/revealjs/demo/index.html", "docs/presentations/revealjs/examples/tabset.html"], + "impact": "serious", + "note": "upstream: quarto-dev/quarto-cli#14970. tabby.js gives revealjs tabset tabs tabindex 1, 2, and so on, so Tab on an earlier slide moves focus to a tab on a hidden slide. Related to quarto-dev/quarto-cli#14795." + }, + { + "signature": "landmark-no-duplicate-banner :: #quarto-header", + "pages": ["docs/blog/posts/2026-05-07-new-blog-home/index.html"], + "impact": "moderate", + "note": "upstream: quarto-dev/quarto-cli#14375. title-block-banner moves #title-block-header out of
, so the page has two top-level banners. Scoped to this post, the only rendered post with a title banner." + }, + { + "signature": "landmark-unique :: #quarto-header", + "pages": ["docs/blog/posts/2026-05-07-new-blog-home/index.html"], + "impact": "moderate", + "note": "upstream: quarto-dev/quarto-cli#14375. title-block-banner moves #title-block-header out of
, so the page has two top-level banners. Scoped to this post, the only rendered post with a title banner." + }, + { + "signature": "region :: #quarto-embed-header", + "pages": ["docs/authoring/penguins-preview.html", "docs/authoring/penguins-qmd.embed-preview.html"], + "impact": "moderate", + "note": "upstream: quarto-dev/quarto-cli#14968. The notebook preview header (#quarto-embed-header) is a plain
outside every landmark. penguins-qmd.embed-preview.html is rendered only when .quarto/ does not exist (quarto-dev/quarto-cli#10756)." + }, + { + "signature": "region :: .quarto-sidebar-toggle-title", + "pages": ["docs/get-started/computations/positron.html", "docs/get-started/hello/positron.html"], + "impact": "moderate", + "note": "upstream: quarto-dev/quarto-cli#14969. The collapsed TOC toggle is a plain
outside every landmark, and a keyboard cannot reach or open it. Flagged only at 320px, where a .column-page-right image on these pages covers the margin TOC." + }, + { + "signature": "landmark-complementary-is-top-level :: aside", + "pages": ["docs/presentations/revealjs/demo/mini/absolute.html", "docs/presentations/revealjs/demo/mini/auto-animate-code.html", "docs/presentations/revealjs/demo/mini/auto-animate-movement.html", "docs/presentations/revealjs/demo/mini/auto-animate-stack.html", "docs/presentations/revealjs/demo/mini/auto-animate.html", "docs/presentations/revealjs/demo/mini/fragments-custom.html", "docs/presentations/revealjs/demo/mini/fragments-nested.html", "docs/presentations/revealjs/demo/mini/fragments.html", "docs/presentations/revealjs/demo/mini/stack.html", "docs/presentations/revealjs/demo/mini/zoom.html", "docs/presentations/revealjs/examples/background-color.html", "docs/presentations/revealjs/examples/background-gradient.html", "docs/presentations/revealjs/examples/background-no-title.html", "docs/presentations/revealjs/examples/code-echo.html", "docs/presentations/revealjs/examples/columns.html", "docs/presentations/revealjs/examples/creating-slides-1.html", "docs/presentations/revealjs/examples/creating-slides-2.html", "docs/presentations/revealjs/examples/creating-slides-3.html", "docs/presentations/revealjs/examples/executable-code-figure-size.html", "docs/presentations/revealjs/examples/footer-and-logo.html", "docs/presentations/revealjs/examples/image-background.html", "docs/presentations/revealjs/examples/incremental-lists-1.html", "docs/presentations/revealjs/examples/incremental-lists-2.html", "docs/presentations/revealjs/examples/incremental-lists-3.html", "docs/presentations/revealjs/examples/incremental-pause.html", "docs/presentations/revealjs/examples/index.html", "docs/presentations/revealjs/examples/line-highlighting-1.html", "docs/presentations/revealjs/examples/line-highlighting-2.html", "docs/presentations/revealjs/examples/line-highlighting-3.html", "docs/presentations/revealjs/examples/line-highlighting-4.html", "docs/presentations/revealjs/examples/no-footer-on-a-slide.html", "docs/presentations/revealjs/examples/per-slide-footer.html", "docs/presentations/revealjs/examples/scrollable-and-smaller.html", "docs/presentations/revealjs/examples/scrollable.html", "docs/presentations/revealjs/examples/smaller.html", "docs/presentations/revealjs/examples/tabset.html"], + "impact": "moderate", + "note": "upstream: hakimel/reveal.js#3369. reveal.js renders the slide controls as