From 2de5eed3ba9ebe7763bfeede9c1ac7895367aa5d Mon Sep 17 00:00:00 2001 From: Charlotte Wickham Date: Thu, 24 Sep 2026 15:36:20 -0700 Subject: [PATCH 01/21] Seed _axe-baseline.json with the one carried-forward entry Re-checked all 27 entries from the old harness baseline (origin/feat/axe-a11y-harness:_tools/axe/baseline.json) against the 2026-09-15 quarto-web 1.11.4 scan. Only scrollable-region-focusable :: #cb still has both a live signature and a note that still holds (quarto-cli#14378, still open). Three entries were fixed upstream (#14615, #14376) and no longer appear. The remaining 23 carried empty notes with no recorded reasoning, so they're held open for a fresh re-triage (accessibility repo strand ax-xmy5f5qm) rather than carried forward blind. --- _axe-baseline.json | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 _axe-baseline.json diff --git a/_axe-baseline.json b/_axe-baseline.json new file mode 100644 index 0000000000..5de561b437 --- /dev/null +++ b/_axe-baseline.json @@ -0,0 +1,11 @@ +{ + "signatureScheme": 1, + "findings": [ + { + "signature": "scrollable-region-focusable :: #cb", + "pages": [], + "impact": "serious", + "note": "upstream: quarto-cli#14378 (scrollable code blocks lack tabindex)" + } + ] +} From cc1ab9b7adb2217607422a3bd9e8a2df41c2b6bc Mon Sep 17 00:00:00 2001 From: Charlotte Wickham Date: Thu, 24 Sep 2026 15:36:20 -0700 Subject: [PATCH 02/21] Accept the dygraphs axis-label contrast on the htmlwidgets page dygraph.js sets the axis-label color with an inline style, so no CSS can override it. dygraph.js >= 2.0 moves it into a stylesheet rule, but the R dygraphs package still bundles 1.1.1 (rstudio/dygraphs#241). Scoped to htmlwidgets.html: the same signature on penguins-preview.html is a real Quarto defect that must stay visible. --- _axe-baseline.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/_axe-baseline.json b/_axe-baseline.json index 5de561b437..b509c93c9c 100644 --- a/_axe-baseline.json +++ b/_axe-baseline.json @@ -6,6 +6,12 @@ "pages": [], "impact": "serious", "note": "upstream: quarto-cli#14378 (scrollable code blocks lack tabindex)" + }, + { + "signature": "color-contrast :: #000000 on #151515", + "pages": ["docs/interactive/widgets/htmlwidgets.html"], + "impact": "serious", + "note": "third-party: dygraphs — can't override the axis-label color with CSS (inline style set by dygraph.js); needs rstudio/dygraphs to upgrade to dygraph.js >= 2.0" } ] } From 52a44cdb38be0ce2d4b3937794bd435c937bc9ba Mon Sep 17 00:00:00 2001 From: Charlotte Wickham Date: Thu, 24 Sep 2026 15:36:20 -0700 Subject: [PATCH 03/21] Accept the Observable Plot g[aria-label] findings as third-party Plot puts an aria-label with no role on the of every mark and axis. 20 signatures in two groups: - 10 axis-tick and grid signatures are fixed in Plot 0.6.14 (observablehq/plot#2018). Quarto bundles Plot 0.6.11, so these wait on quarto-cli#14934. Prune them when Quarto updates Plot. - 10 data-mark signatures still occur in Plot 0.6.17. Plot labels marks on purpose (observablehq/plot#944); the open request for a role is observablehq/plot#1760. --- _axe-baseline.json | 120 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/_axe-baseline.json b/_axe-baseline.json index b509c93c9c..382367c690 100644 --- a/_axe-baseline.json +++ b/_axe-baseline.json @@ -12,6 +12,126 @@ "pages": ["docs/interactive/widgets/htmlwidgets.html"], "impact": "serious", "note": "third-party: dygraphs — can't override the axis-label color with CSS (inline style set by dygraph.js); needs rstudio/dygraphs to upgrade to dygraph.js >= 2.0" + }, + { + "signature": "aria-prohibited-attr :: g[aria-label=\"y-axis tick\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — axis tick/grid has aria-label with no role; fixed in Plot 0.6.14 (observablehq/plot#2018), but Quarto bundles Plot 0.6.11 (quarto-cli#14934). Prune when Quarto updates Plot." + }, + { + "signature": "aria-prohibited-attr :: g[aria-label=\"x-axis tick\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — axis tick/grid has aria-label with no role; fixed in Plot 0.6.14 (observablehq/plot#2018), but Quarto bundles Plot 0.6.11 (quarto-cli#14934). Prune when Quarto updates Plot." + }, + { + "signature": "aria-prohibited-attr :: g[aria-label=\"rect\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — every mark gets an aria-label with no role, by design (observablehq/plot#944, #1760). Not fixed in Plot 0.6.17." + }, + { + "signature": "aria-prohibited-attr :: g[aria-label=\"frame\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — every mark gets an aria-label with no role, by design (observablehq/plot#944, #1760). Not fixed in Plot 0.6.17." + }, + { + "signature": "aria-prohibited-attr :: #ojs-cell > .ojs-in-a-box-waiting-for-module-import.observablehq > .plot-d6a7b5[font-family=\"system-ui, sans-serif\"][font-size=\"*\"] > g[aria-label=\"y-axis tick\"][transform=\"translate(*,*.*)\"][fill=\"none\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — axis tick/grid has aria-label with no role; fixed in Plot 0.6.14 (observablehq/plot#2018), but Quarto bundles Plot 0.6.11 (quarto-cli#14934). Prune when Quarto updates Plot." + }, + { + "signature": "aria-prohibited-attr :: #ojs-cell > .ojs-in-a-box-waiting-for-module-import.observablehq > .plot-d6a7b5[font-family=\"system-ui, sans-serif\"][font-size=\"*\"] > g[aria-label=\"x-axis tick\"][transform=\"translate(*.*,*)\"][fill=\"none\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — axis tick/grid has aria-label with no role; fixed in Plot 0.6.14 (observablehq/plot#2018), but Quarto bundles Plot 0.6.11 (quarto-cli#14934). Prune when Quarto updates Plot." + }, + { + "signature": "aria-prohibited-attr :: #ojs-cell > .ojs-in-a-box-waiting-for-module-import.observablehq > .plot-d6a7b5[font-family=\"system-ui, sans-serif\"][font-size=\"*\"] > g[aria-label=\"line\"][stroke-width=\"*.*\"][stroke-linejoin=\"round\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — every mark gets an aria-label with no role, by design (observablehq/plot#944, #1760). Not fixed in Plot 0.6.17." + }, + { + "signature": "aria-prohibited-attr :: #ojs-cell > .ojs-in-a-box-waiting-for-module-import.observablehq > .plot-d6a7b5[height=\"*\"][viewBox=\"* * * *\"] > g[aria-label=\"y-axis tick\"][transform=\"translate(*,*.*)\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — axis tick/grid has aria-label with no role; fixed in Plot 0.6.14 (observablehq/plot#2018), but Quarto bundles Plot 0.6.11 (quarto-cli#14934). Prune when Quarto updates Plot." + }, + { + "signature": "aria-prohibited-attr :: #ojs-cell > .ojs-in-a-box-waiting-for-module-import.observablehq > .plot-d6a7b5[height=\"*\"][viewBox=\"* * * *\"] > g[aria-label=\"x-axis tick\"][transform=\"translate(*.*,*)\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — axis tick/grid has aria-label with no role; fixed in Plot 0.6.14 (observablehq/plot#2018), but Quarto bundles Plot 0.6.11 (quarto-cli#14934). Prune when Quarto updates Plot." + }, + { + "signature": "aria-prohibited-attr :: #ojs-cell > .ojs-in-a-box-waiting-for-module-import.observablehq > .plot-d6a7b5[height=\"*\"][viewBox=\"* * * *\"] > g[aria-label=\"frame\"][transform=\"translate(*.*,*.*)\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — every mark gets an aria-label with no role, by design (observablehq/plot#944, #1760). Not fixed in Plot 0.6.17." + }, + { + "signature": "aria-prohibited-attr :: #ojs-cell > .ojs-in-a-box-waiting-for-module-import.observablehq > .plot-d6a7b5[height=\"*\"][viewBox=\"* * * *\"] > g[aria-label=\"rect\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — every mark gets an aria-label with no role, by design (observablehq/plot#944, #1760). Not fixed in Plot 0.6.17." + }, + { + "signature": "aria-prohibited-attr :: g[aria-label=\"line\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — every mark gets an aria-label with no role, by design (observablehq/plot#944, #1760). Not fixed in Plot 0.6.17." + }, + { + "signature": "aria-prohibited-attr :: g[aria-label=\"y-grid\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — axis tick/grid has aria-label with no role; fixed in Plot 0.6.14 (observablehq/plot#2018), but Quarto bundles Plot 0.6.11 (quarto-cli#14934). Prune when Quarto updates Plot." + }, + { + "signature": "aria-prohibited-attr :: g[aria-label=\"x-grid\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — axis tick/grid has aria-label with no role; fixed in Plot 0.6.14 (observablehq/plot#2018), but Quarto bundles Plot 0.6.11 (quarto-cli#14934). Prune when Quarto updates Plot." + }, + { + "signature": "aria-prohibited-attr :: g[aria-label=\"rule\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — every mark gets an aria-label with no role, by design (observablehq/plot#944, #1760). Not fixed in Plot 0.6.17." + }, + { + "signature": "aria-prohibited-attr :: svg[height=\"*\"] > g[aria-label=\"y-axis tick\"][transform=\"translate(*,*.*)\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — axis tick/grid has aria-label with no role; fixed in Plot 0.6.14 (observablehq/plot#2018), but Quarto bundles Plot 0.6.11 (quarto-cli#14934). Prune when Quarto updates Plot." + }, + { + "signature": "aria-prohibited-attr :: svg[height=\"*\"] > g[aria-label=\"x-axis tick\"][transform=\"translate(*.*,*)\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — axis tick/grid has aria-label with no role; fixed in Plot 0.6.14 (observablehq/plot#2018), but Quarto bundles Plot 0.6.11 (quarto-cli#14934). Prune when Quarto updates Plot." + }, + { + "signature": "aria-prohibited-attr :: svg[height=\"*\"] > g[aria-label=\"frame\"][transform=\"translate(*.*,*.*)\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — every mark gets an aria-label with no role, by design (observablehq/plot#944, #1760). Not fixed in Plot 0.6.17." + }, + { + "signature": "aria-prohibited-attr :: svg[height=\"*\"] > g[aria-label=\"rect\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — every mark gets an aria-label with no role, by design (observablehq/plot#944, #1760). Not fixed in Plot 0.6.17." + }, + { + "signature": "aria-prohibited-attr :: g[aria-label=\"tick\"]", + "pages": [], + "impact": "serious", + "note": "third-party: Observable Plot — every mark gets an aria-label with no role, by design (observablehq/plot#944, #1760). Not fixed in Plot 0.6.17." } ] } From e0ff19239b4d0311922979a6da9bfa160ee3cadb Mon Sep 17 00:00:00 2001 From: Charlotte Wickham Date: Thu, 24 Sep 2026 15:36:21 -0700 Subject: [PATCH 04/21] Accept the Observable Inputs unlabeled slider and checkbox findings as third-party Inputs.range puts its