fix: resolve WCAG 2.1 AA accessibility issues across SciX blog pages#622
fix: resolve WCAG 2.1 AA accessibility issues across SciX blog pages#622thostetler wants to merge 7 commits intoadsabs:masterfrom
Conversation
- Add alt text to thumbnail images in news, general, and technical-posts listing pages - Fix contrast and layout issues in blog layout and post templates - Fix shared navbar dropdown role attribute and footer link target sizes - Add alt text to results chart image in nasa-open-access post - Add docker-based local dev config
… sia-r53, sia-r77, sia-r68)
… sia-r77, sia-r68, sia-r2)
There was a problem hiding this comment.
Pull request overview
This PR targets WCAG 2.1 AA accessibility improvements across SciX blog pages by fixing missing/incorrect semantics (document titles, heading levels), providing image alternative text, and adjusting CSS for target size/contrast. It also introduces a Docker-based local dev workflow for the site.
Changes:
- Add/normalize semantic structure (page titles, heading levels,
lang,nav/main) across SciX blog layouts and many blog posts. - Add missing
alttext to many blog images and adjust CSS to improve tap target sizing and contrast. - Add Docker + Docker Compose +
./runhelper script and document the workflow in the README.
Reviewed changes
Copilot reviewed 59 out of 59 changed files in this pull request and generated 11 comments.
Show a summary per file
| File | Description |
|---|---|
| scixblog/index.md | Adds page title and alt text for post thumbnails in SciX “All Posts” listing. |
| scixblog/news/index.md | Adds page title and alt text for post thumbnails in SciX “News” listing. |
| scixblog/general/index.md | Adds page title and alt text for post thumbnails in SciX “General” listing. |
| scixblog/technical-posts/index.md | Adds page title and alt text for post thumbnails in SciX “Technical Posts” listing. |
| _layouts/blog_layout_scix.html | Adds lang, wraps blog links in nav, introduces main wrapper. |
| _layouts/blog_page_scix.html | Promotes page title heading to h1. |
| _layouts/blog_post_scix.html | Removes author/date from heading structure by switching to <p> elements. |
| _includes/header_default_scix.html | Tweaks header semantics (removes role="menu", adds banner role). |
| _sass/_layout.scss | Target-size and typography tweaks; fixes invalid line-height; increases label contrast. |
| _sass/_darkmode.scss | Improves dark mode toggle sizing and legibility. |
| _includes/_blogcontent/2025-09-29-scix-launch.md | Adds image alt text; adjusts Press Coverage heading level. |
| _includes/_blogcontent/2025-08-25-scix-data-collections.md | Adds image alt text; normalizes heading levels. |
| _includes/_blogcontent/2025-07-01-scix-visualizations.md | Adds image alt text; normalizes heading levels. |
| _includes/_blogcontent/2025-03-25-what-i-wish-i-knew-about-ads-scix-during-my-phd.md | Adds image alt text. |
| _includes/_blogcontent/2025-02-27-scix-earth-science-literature-review.md | Adds image alt text. |
| _includes/_blogcontent/2025-02-27-scix-ambassador-workshop.md | Adds image alt text. |
| _includes/_blogcontent/2024-08-01-data-linking-III.md | Adds image alt text. |
| _includes/_blogcontent/2024-07-01-data-linking-II.md | Adds image alt text. |
| _includes/_blogcontent/2024-06-13-data-linking-I.md | Adds image alt text. |
| _includes/_blogcontent/2024-06-04-HistoricLit.md | Adds image alt text. |
| _includes/_blogcontent/2024-03-06-introducing-scix-ambassador-program.md | Normalizes heading levels; adds image alt text. |
| _includes/_blogcontent/2024-02-26-userfeedback-2024.md | Normalizes heading levels; adds image alt text. |
| _includes/_blogcontent/2024-01-03-aas-2024.md | Adds image alt text. |
| _includes/_blogcontent/2023-10-23-ads-models-and-datasets.md | Normalizes heading levels; adds image alt text. |
| _includes/_blogcontent/2023-04-19-scix.md | Adds image alt text. |
| _includes/_blogcontent/2023-03-20-curation-model.md | Adds image alt text. |
| _includes/_blogcontent/2022-12-29-uat-integration.md | Converts footnote list to a normal list for readability. |
| _includes/_blogcontent/2022-09-06-ads-object-search.md | Inlines/explains a footnote; adds image alt text. |
| _includes/_blogcontent/2021-11-12-arc-ssad-project.md | Normalizes heading levels. |
| _includes/_blogcontent/2021-08-04-openapi-docs.md | Adds image alt text. |
| _includes/_blogcontent/2021-04-15-affils-update.md | Normalizes heading levels; adds image alt text. |
| _includes/_blogcontent/2020-08-10-the_new_myADS.md | Adds image alt text. |
| _includes/_blogcontent/2020-05-29-ui-updates.md | Adds image alt text. |
| _includes/_blogcontent/2020-04-06-nasa-open-access.md | Adds image alt text. |
| _includes/_blogcontent/2020-01-15-affiliations-feature.md | Normalizes heading levels; adds image alt text. |
| _includes/_blogcontent/2019-05-30-ave-atque-vale.md | Adds image alt text. |
| _includes/_blogcontent/2019-04-11-transition-reminder.md | Normalizes heading levels; adds image alt text. |
| _includes/_blogcontent/2019-03-26-citations-journals-3.md | Adds image alt text. |
| _includes/_blogcontent/2019-02-13-updates2.md | Normalizes heading levels; adds image alt text. |
| _includes/_blogcontent/2018-10-22-citations-journals-2.md | Normalizes heading levels; adds image alt text. |
| _includes/_blogcontent/2018-08-20-citations-journals.md | Adds image alt text. |
| _includes/_blogcontent/2018-07-17-concepts-at-work.md | Adds image alt text. |
| _includes/_blogcontent/2018-05-24-transition.md | Normalizes heading levels. |
| _includes/_blogcontent/2018-04-11-updates.md | Normalizes heading levels. |
| _includes/_blogcontent/2018-02-05-asclepias.md | Adds image alt text; replaces markdown tables with semantic HTML tables. |
| _includes/_blogcontent/2017-12-12-adsug.md | Normalizes heading levels. |
| _includes/_blogcontent/2017-10-05-100M-citations.md | Adds image alt text. |
| _includes/_blogcontent/2016-03-16-open-access-and-nasa-data.md | Adds image alt text. |
| _includes/_blogcontent/2016-02-17-building-an-app.md | Normalizes heading levels; adds image alt text. |
| _includes/_blogcontent/2015-11-17-discovering-long-fuse-papers.md | Adds image alt text. |
| _includes/_blogcontent/2015-11-03-ads-private-libraries.md | Adds image alt text. |
| _includes/_blogcontent/2015-10-21-visualising-metrics-with-bbb.md | Adds image alt text. |
| _includes/_blogcontent/2015-07-15-introducing-bumblebee.md | Adds image alt text. |
| Dockerfile | Adds container image for building/serving the Jekyll site. |
| docker-compose.yml | Adds compose services for serve/dev/build workflows. |
| run | Adds convenience wrapper for Docker Compose workflows. |
| .dockerignore | Excludes build outputs and local/dev artifacts from Docker build context. |
| _config.yml | Excludes Docker/dev files and vendor directory from Jekyll build output. |
| README.md | Documents Docker-based development workflow. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
You can also share your feedback on Copilot code review. Take the survey.
| services: | ||
| jekyll: | ||
| build: . | ||
| volumes: | ||
| - .:/site | ||
| - bundle_cache:/usr/local/bundle | ||
| environment: | ||
| - JEKYLL_ENV=${JEKYLL_ENV:-development} | ||
|
|
There was a problem hiding this comment.
jekyll has no profiles entry, so it will be started by default even when running docker compose --profile serve/dev/build .... Because jekyll also has a default CMD that runs jekyll serve, this likely results in an extra, unintended container running alongside serve/dev/build. Consider replacing extends with YAML anchors (x- + <<:) for shared config, or put jekyll behind a never-enabled profile so it isn't started.
| <div class="col-md-2"> | ||
| {% if post.thumbnail %} | ||
| <img src="{{ site.baseurl }}/{{ post.thumbnail }}" style="width: 280px"/> | ||
| <img src="{{ site.baseurl }}/{{ post.thumbnail }}" alt="{{ post.title }}" style="width: 280px"/> | ||
| {% else %} | ||
| <img src="{{ site.baseurl }}/img/ads_logo.png" style="width: 280px"/> | ||
| <img src="{{ site.baseurl }}/img/ads_logo.png" alt="{{ post.title }}" style="width: 280px"/> | ||
| {% endif %} | ||
| </div> |
There was a problem hiding this comment.
The fallback image (/img/ads_logo.png) is always given alt="{{ post.title }}", but that alt text doesn't describe the logo and can mislead screen reader users. If this logo is decorative in the listing, prefer alt=""; otherwise use a truthful alt like "ADS logo"/"SciX logo".
| // Ensure standalone list links and ambassador profile links meet 44px minimum | ||
| // target size (WCAG 2.5.5, sia-r111). | ||
| .post-content li > a, | ||
| .post-content blockquote p > a, | ||
| .textlabel p > a { | ||
| display: inline-block; | ||
| min-height: 44px; | ||
| line-height: 44px; | ||
| } |
There was a problem hiding this comment.
Setting line-height: 44px on inline links (e.g. .post-content li > a) can create overly tall lines and awkward spacing when links wrap to multiple lines, which can harm readability. To meet the 44px target-size requirement, prefer using padding (e.g., padding-block) with a min-height while keeping a normal text line-height.
| <div class="press-coverage-header"> | ||
| <h4><i class="fa fa-newspaper-o"></i>Press Coverage</h4> | ||
| <h3><i class="fa fa-newspaper-o"></i>Press Coverage</h3> | ||
| <button class="close-button" onclick="event.stopPropagation(); togglePressCoverage();">×</button> |
There was a problem hiding this comment.
The heading was changed from h4 to h3, but the embedded CSS still targets .press-coverage-header h4, so the intended header styling will no longer apply. Update the selector to match the new heading level (or, better, target a class instead of a specific heading tag).
There was a problem hiding this comment.
This sounds like a reasonable catch.
| cat <<EOF | ||
| Usage: ./site <command> | ||
There was a problem hiding this comment.
The usage text says Usage: ./site <command> but the script name in this repo is run (and README instructs ./run ...). This will mislead users when they invoke the script incorrectly; update the usage string to match the actual entrypoint name (or rename the script to site to match the help text).
| {% if post.thumbnail %} | ||
| <img src="{{ site.baseurl }}/{{ post.thumbnail }}" style="max-width: 340px;height:auto"/> | ||
| <img src="{{ site.baseurl }}/{{ post.thumbnail }}" alt="{{ post.title }}" style="max-width: 340px;height:auto"/> | ||
| {% else %} | ||
| <img src="{{ site.baseurl }}/img/ads_logo.png" style="max-width: 340px;height:auto"/> | ||
| <img src="{{ site.baseurl }}/img/ads_logo.png" alt="{{ post.title }}" style="max-width: 340px;height:auto"/> | ||
| {% endif %} |
There was a problem hiding this comment.
The fallback image (/img/ads_logo.png) is always given alt="{{ post.title }}", but that alt text doesn't describe the logo and can mislead screen reader users. If this logo is decorative in the listing, prefer alt=""; otherwise use a truthful alt like "ADS logo"/"SciX logo" (and consider linking the image to the post to avoid duplicate title announcements).
There was a problem hiding this comment.
It looks like we can go with alt="ADS/SciX logo" here
| <div class="col-md-2"> | ||
| {% if post.thumbnail %} | ||
| <img src="{{ site.baseurl }}/{{ post.thumbnail }}" style="width: 280px"/> | ||
| <img src="{{ site.baseurl }}/{{ post.thumbnail }}" alt="{{ post.title }}" style="width: 280px"/> | ||
| {% else %} | ||
| <img src="{{ site.baseurl }}/img/ads_logo.png" style="width: 280px"/> | ||
| <img src="{{ site.baseurl }}/img/ads_logo.png" alt="{{ post.title }}" style="width: 280px"/> | ||
| {% endif %} | ||
| </div> |
There was a problem hiding this comment.
The fallback image (/img/ads_logo.png) is always given alt="{{ post.title }}", but that alt text doesn't describe the logo and can mislead screen reader users. If this logo is decorative in the listing, prefer alt=""; otherwise use a truthful alt like "ADS logo"/"SciX logo".
| <div class="col-md-2"> | ||
| {% if post.thumbnail %} | ||
| <img src="{{ site.baseurl }}/{{ post.thumbnail }}" style="width: 280px"/> | ||
| <img src="{{ site.baseurl }}/{{ post.thumbnail }}" alt="{{ post.title }}" style="width: 280px"/> | ||
| {% else %} | ||
| <img src="{{ site.baseurl }}/img/ads_logo.png" style="width: 280px"/> | ||
| <img src="{{ site.baseurl }}/img/ads_logo.png" alt="{{ post.title }}" style="width: 280px"/> | ||
| {% endif %} | ||
| </div> |
There was a problem hiding this comment.
The fallback image (/img/ads_logo.png) is always given alt="{{ post.title }}", but that alt text doesn't describe the logo and can mislead screen reader users. If this logo is decorative in the listing, prefer alt=""; otherwise use a truthful alt like "ADS logo"/"SciX logo".
scixblog/index.md
Outdated
| title: "All Posts" | ||
| --- | ||
|
|
||
| [Sign up](http://eepurl.com/ggoxhn) for our monthly email updates. |
There was a problem hiding this comment.
The link to the newsletter signup uses http:// instead of https://, which allows a network attacker to tamper with the signup form or redirect users to a phishing page before they enter their email address. Because this is an email subscription endpoint, compromising it could expose users’ email addresses or trick them into submitting credentials elsewhere. Update the link target to use https://eepurl.com/ggoxhn so the initial request and returned form are protected by TLS.
| @@ -1,48 +1,48 @@ | |||
|
|
|||
| We’ve rolled out a number of changes to the new ADS over the summer and fall, some of which you’ve likely noticed and others which may have passed you by. Read on for a summary of some of the bigger updates. If you want to stay up to date on changes with ADS, [sign up](http://eepurl.com/ggoxhn) for our monthly newsletter or check in occasionally with our [What’s New page](../help/whats_new/). | |||
There was a problem hiding this comment.
This newsletter signup link uses http:// instead of https://, which allows a man-in-the-middle attacker to intercept or modify the subscription page and harvest email addresses or inject a phishing form. Because users are encouraged here to subscribe for ongoing updates, the link should not rely on plaintext HTTP. Change the target to https://eepurl.com/ggoxhn so the signup flow is protected end-to-end by TLS.
| <div class="press-coverage-header"> | ||
| <h4><i class="fa fa-newspaper-o"></i>Press Coverage</h4> | ||
| <h3><i class="fa fa-newspaper-o"></i>Press Coverage</h3> | ||
| <button class="close-button" onclick="event.stopPropagation(); togglePressCoverage();">×</button> |
There was a problem hiding this comment.
This sounds like a reasonable catch.
- Fix fallback logo alt text to "ADS/SciX logo" on all listing pages - Convert darkSwitch div to button with aria-label; sync aria-label on toggle - Replace line-height: 44px with padding-block on list links - Update .press-coverage-header CSS selector from h4 to h3 - Remove redundant role="banner" from semantic <header> - Update newsletter signup links from http to https
Resolves a broad set of accessibility failures found via the Siteimprove Alfa scanner across 57+ SciX blog pages. All rules now pass with zero
failedoutcomes.Bunch of accessibility updates for the `/scixblog/
Results by Rule
Remaining Issues
The following rules have unresolved findings and represent the next areas to address: