# data[].attributes.title
Built-in accessibility: blessing or curse?

# data[].attributes.slidedeck.data[].slides[].desc.html
Hidde de Vries, JS Heroes, Cluj-Napoca, May 2025 “Built-in” accessibility: blessing or curse?

# data[].attributes.slidedeck.data[].slides[].desc.html
25 years ago…

# data[].attributes.slidedeck.data[].slides[].desc.html
Websites with sticky elements that cover everything when zoomed aren’t accessible codepen.io/hidde/pen/PovjPYV

# data[].attributes.slidedeck.data[].slides[].desc.html
Websites with FAQs that aren’t reachable by just a keyboard aren’t accessible codepen.io/hidde/pen/ExzXVmb

# data[].attributes.slidedeck.data[].slides[].desc.html
Websites with important election results in an image with no alternatives aren’t accessible

# data[].attributes.slidedeck.data[].slides[].desc.html
Disability is a spectrum

# data[].attributes.slidedeck.data[].slides[].desc.html
so is access

# data[].attributes.slidedeck.data[].slides[].desc.html
People will - zoom in use high contrast modes use a screenreader not use a mouse use voice recognition be unable to turn their device W3C/WAI, How People with Disabilities Use the Web https://www.w3.org/WAI/people-use-web/tools-techniques

# data[].attributes.slidedeck.data[].slides[].desc.html
We need better websites…

# data[].attributes.slidedeck.data[].slides[].desc.html
(lack of) Accessibility is a website problem, not a user problem

# data[].attributes.slidedeck.data[].slides[].desc.html
In defense of websites… Hard to ind good code examples • AT/browser support vs actual usability • WCAG often can’t tell you what to do (for reasons, but still) f •

# data[].attributes.slidedeck.data[].slides[].desc.html
Many of us “Are there opportunities to change the system to improve accessibility across the board?”

# data[].attributes.slidedeck.data[].slides[].desc.html
Managers “Can we integrate accessibility into our practices?”

# data[].attributes.slidedeck.data[].slides[].desc.html
Browsers “Can we display websites better?”

# data[].attributes.slidedeck.data[].slides[].desc.html
CMSes “Can we help content editors edit more accessible content?”

# data[].attributes.slidedeck.data[].slides[].desc.html
Standards bodies “Can we make standards that take accessibility into account”?

# data[].attributes.slidedeck.data[].slides[].desc.html
Built-in accessibility: blessing or curse?

# data[].attributes.slidedeck.data[].slides[].desc.html
Built-in accessibility: blessing and curse

# data[].attributes.slidedeck.data[].slides[].desc.html
Web Platform features CMSes Browsers Design Systems

# data[].attributes.slidedeck.data[].slides[].desc.html
Building accessibility into systems (1) Web Platform features

# data[].attributes.slidedeck.data[].slides[].desc.html
Building accessibility into systems (1) Web Platform features // features that make a11y possible, // e.g. support for alt text <img src=”” alt=”” />

# data[].attributes.slidedeck.data[].slides[].desc.html
Building accessibility into systems (1) Web Platform features // features that make a11y possible, // e.g. support for captions <video> <track>…</track> </video>

# data[].attributes.slidedeck.data[].slides[].desc.html
Building accessibility into systems (1) Web Platform features // features that do accessibility // semantics for you, like headings <h1>Top news</h1>

# data[].attributes.slidedeck.data[].slides[].desc.html
Building accessibility into systems (1) Web Platform features // features that do accessibility // semantics for you, like headings <h1>Top news</h1>

# data[].attributes.slidedeck.data[].slides[].desc.html
// features that do some // accessibility semantics // for you, like popover I am popover content <button popovertarget=”p”> Open popover </button> <div popover id=”p”> I am popover content </div>

# data[].attributes.slidedeck.data[].slides[].desc.html
// features that do some // accessibility semantics // for you, like popover I am popover content <button popovertarget=”p”> Open popover </button> <div popover id=”p”> I am popover content </div>

# data[].attributes.slidedeck.data[].slides[].desc.html
‘Built-in’: aria-expanded state I am popover content See: On popover accessibility: what the browser does and doesn’t do https://hidde.blog/popover-accessibility/

# data[].attributes.slidedeck.data[].slides[].desc.html
‘Built-in’: aria-expanded state aria-details relationship (if apt) I am popover content See: On popover accessibility: what the browser does and doesn’t do https://hidde.blog/popover-accessibility/

# data[].attributes.slidedeck.data[].slides[].desc.html
‘Built-in’: aria-expanded state aria-details relationship (if apt) I am popover content group fallback role (if apt) See: On popover accessibility: what the browser does and doesn’t do https://hidde.blog/popover-accessibility/

# data[].attributes.slidedeck.data[].slides[].desc.html
‘Built-in’: aria-expanded state aria-details relationship (if apt) I am popover content group fallback role (if apt) some focus management See: On popover accessibility: what the browser does and doesn’t do https://hidde.blog/popover-accessibility/

# data[].attributes.slidedeck.data[].slides[].desc.html
Not built-in: colour contrast zoom support I am popover content etc etc See: On popover accessibility: what the browser does and doesn’t do https://hidde.blog/popover-accessibility/

# data[].attributes.slidedeck.data[].slides[].desc.html
// features that do some // accessibility semantics // for you, like commandfor <button command=”show-modal” commandfor=”d”> Open my modal dialog </button> <dialog id=”d”> My modal content </dialog>

# data[].attributes.slidedeck.data[].slides[].desc.html
‘Built-in’: some focus management Not built-in: aria-expanded colour contrast zoom support etc etc

# data[].attributes.slidedeck.data[].slides[].desc.html
// or accordions // features that do some accessibility
<details> 1. Tell the truth. 2. Act now // semantics for you, like accordions <summary>Tell the…</summary> <details> … Governments must act now to halt biodiversity loss and reduce greenhouse gas emissions to net zero by 2025. 3. Go beyond pol t cs <summary>Tell the truth</summary> … </details> </details> <details open> <details open> <summary>Act now</summary> … <summary>Act now</summary> </details> …<details> <summary>Go beyond policy</summary> </details> … <details> </details> <summary>Go beyond…</summary> i i …

# data[].attributes.slidedeck.data[].slides[].desc.html
// or exclusive accordions // features that do some accessibility
<details name=”xr”> 1. Tell the truth. 2. Act now // semantics for you, like accordions <summary>Tell the…</summary> <details> … Governments must act now to halt biodiversity loss and reduce greenhouse gas emissions to net zero by 2025. 3. Go beyond pol t cs <summary>Tell the truth</summary> … </details> </details> <details open> <details open name=”xr”> <summary>Act now</summary> … <summary>Act now</summary> </details> …<details> <summary>Go beyond policy</summary> </details> … <details name=”xr”> </details> <summary>Go beyond…</summary> i i …

# data[].attributes.slidedeck.data[].slides[].desc.html
‘Built-in’: 1. Tell the truth. 2. Act now Governments must act now to halt biodiversity loss and reduce greenhouse gas emissions to net zero by 2025. i i 3. Go beyond pol t cs aria-expanded state

# data[].attributes.slidedeck.data[].slides[].desc.html
More web UI features are on the way to browsers (HTML/CSS). Consider what is built in, what is not.

# data[].attributes.slidedeck.data[].slides[].desc.html
“Horizontal review” in standards processes See: FAST w3c.github.io/apa/fast/

# data[].attributes.slidedeck.data[].slides[].desc.html
Self-review in TAG z Self-Review Questionnaire: Accessibility github.com/w3ctag/accessibility-questionnaire/blob/main/accessibility-questionnaire.md

# data[].attributes.slidedeck.data[].slides[].desc.html
Implementations in browsers can have accessibility bugs It’s Mid-2022 and Browsers (Mostly Safari) Still Break Accessibility via Display Properties adrianroselli.com/2022/07/its-mid-2022-and-browsers-mostly-safari-still-break-accessibility-via-display-properties.html

# data[].attributes.slidedeck.data[].slides[].desc.html
Chromium Blog, Updates to form controls and focus blog.chromium.org/2020/03/updates-to-form-controls-and-focus.html

# data[].attributes.slidedeck.data[].slides[].desc.html
Chromium Blog, Updates to form controls and focus blog.chromium.org/2020/03/updates-to-form-controls-and-focus.html

# data[].attributes.slidedeck.data[].slides[].desc.html
Improvements re making accessibility tree testable >1000 Web Platform Tests labeled “accessibility” See: Improving Web Accessibility with Web Platform Tests webkit.org/blog/15400/improving-web-accessibility-with-web-platform-tests/

# data[].attributes.slidedeck.data[].slides[].desc.html
TAKEAWAY #1 We need web platform / HTML features that are accessible, implemented accessibly and/or include accessibility and it’s not trivial

# data[].attributes.slidedeck.data[].slides[].desc.html
Building accessibility into systems (2) CMSes

# data[].attributes.slidedeck.data[].slides[].desc.html
Video: Tyler Frisbee (youtube.com/watch?v=3G_uCbKoG5A) hidde.blog

# data[].attributes.slidedeck.data[].slides[].desc.html
Checks in Jooa11y, for Joomla (based on Sa11y)

# data[].attributes.slidedeck.data[].slides[].desc.html
Checks in Editoria11y v2, for Drupal (Based on Sa11y)

# data[].attributes.slidedeck.data[].slides[].desc.html
Contrast warnings in Gutenberg, for WordPress Checks in Editoria11y v2, for Drupal (Based on Sa11y)

# data[].attributes.slidedeck.data[].slides[].desc.html
Porta11y, accessible checks for Portable Text github.com/hidde/porta11y github.com/hidde/porta11y Checks in Editoria11y v2, for Drupal (Based on Sa11y)

# data[].attributes.slidedeck.data[].slides[].desc.html
TAKEAWAY #2 CMSes can be accessibility assistants and it’s (usually) not trivial

# data[].attributes.slidedeck.data[].slides[].desc.html
Building accessibility into systems (3) Browsers

# data[].attributes.slidedeck.data[].slides[].desc.html
user agents

# data[].attributes.slidedeck.data[].slides[].desc.html
agents for the user

# data[].attributes.slidedeck.data[].slides[].desc.html
What if browsers let us… https://booktravel.business Booktravel Visit Kinderdijk enforce contrast

# data[].attributes.slidedeck.data[].slides[].desc.html
What if browsers let us… ✓ https://booktravel.business Booktravel Visit Kinderdijk enforce contrast

# data[].attributes.slidedeck.data[].slides[].desc.html
Designer I want the focus outline to be 1px light gray User Actually, I want to see where I am, let me see a focus outline User agent (the user’s agent) Ok, I’ll make it 10px black

# data[].attributes.slidedeck.data[].slides[].desc.html
f f “Could browsers ix more accessibility problems automatically?” talks.hiddedevries.nl/KKW74X/could-browsers- ix-more-accessibility-problems-automatically

# data[].attributes.slidedeck.data[].slides[].desc.html
TAKEAWAY #3 Browsers could intervene when the web content they serve is inaccessible and it’s (usually) not trivial

# data[].attributes.slidedeck.data[].slides[].desc.html
Building accessibility into systems (4) Design systems

# data[].attributes.slidedeck.data[].slides[].desc.html
Design systems can make your patterns repeatable

# data[].attributes.slidedeck.data[].slides[].desc.html
“Not only is this work not inherently valuable, it is also not inherently harmless” — Amy Hupe Building conscious design systems amyhupe.co.uk/articles/building-conscious-design-systems

# data[].attributes.slidedeck.data[].slides[].desc.html
Design systems can make good patterns repeatable

# data[].attributes.slidedeck.data[].slides[].desc.html
Design systems can good make good patterns d ba repeatable or

# data[].attributes.slidedeck.data[].slides[].desc.html
Design systems can teach the nuance between the components

# data[].attributes.slidedeck.data[].slides[].desc.html
TAKEAWAY #4 Design Systems make code and principles repeatable, ensure you repeat the right things f and it’s (de and initely) it’s not trivial

# data[].attributes.slidedeck.data[].slides[].desc.html
“Built-in” accessibility It can be done. It’s worthwhile. It’s not trivial.

# data[].attributes.slidedeck.data[].slides[].desc.html
What are the or: questions constraints? you can ask

# data[].attributes.slidedeck.data[].slides[].desc.html
What could (possibly) go wrong?

# data[].attributes.slidedeck.data[].slides[].desc.html
Does the icon disappear in dark mode? Will the tabs break with too many items? What if all buttons in a group are named the same? How do we ensure there’s useful text in <FormFieldError>? f Can we force the label component to be used whenever the text ield component is used?

# data[].attributes.slidedeck.data[].slides[].desc.html
What decides the accessibility of a component?

# data[].attributes.slidedeck.data[].slides[].desc.html
Save

# data[].attributes.slidedeck.data[].slides[].desc.html
The quick brown fox jumps Where does she jump? Over the lazy dog? Well, there is really only one way to ind out… f Find out

# data[].attributes.slidedeck.data[].slides[].desc.html
Who impacts the accessibility of a UI?

# data[].attributes.slidedeck.data[].slides[].desc.html
developer QA tester designer Who impacts the accessibility of a UI? researcher content editor

# data[].attributes.slidedeck.data[].slides[].desc.html
browser that renders it What impacts the accessibility of a UI? assistive technology CMS that is involved with managing it

# data[].attributes.slidedeck.data[].slides[].desc.html
A design system can impact through components and docs

# data[].attributes.slidedeck.data[].slides[].desc.html
What design system components can do • User preference support (dark/forced color mode, text spacing, zoom support) • Accessibility semantics (roles, states, properties) • Keyboard support • Focus management • Support for accessibility features (images: alt support, video players: caption support, etc)

# data[].attributes.slidedeck.data[].slides[].desc.html
What design system docs can do • All variables/settings documented • Theme validator (colour f contrast, spacing etc) • Full lows: how do components work together? • Showing the right way

# data[].attributes.slidedeck.data[].slides[].desc.html
What design system docs can do • All variables/settings documented • Theme validator (colour f contrast, spacing etc) • Full lows: how do components work together? • Showing the right way

# data[].attributes.slidedeck.data[].slides[].desc.html
“Educate, don’t berate” — Meryl Evans (in “Progress over perfection“)

# data[].attributes.slidedeck.data[].slides[].desc.html
Used as-is Interpreted Components (excluding settings) Documentation Component settings

# data[].attributes.slidedeck.data[].slides[].desc.html
TAKEAWAY #6 Components that people reuse and documentation that people interpret are an opportunity to inspire quality

# data[].attributes.slidedeck.data[].slides[].desc.html
What design system marketing should do Avoid overpromising the accessibility impact Say “makes it easier to” instead of “will take care of” ff Emphasise the role of design system in a continuous e ort

# data[].attributes.slidedeck.data[].slides[].desc.html
Wrapping up

# data[].attributes.slidedeck.data[].slides[].desc.html
Built-in accessibility: blessing and curse

# data[].attributes.slidedeck.data[].slides[].desc.html
“Built-in” accessibility It’s not trivial, not a oneoff, not a quick “fix”. It can be done. It’s worthwhile.

# data[].attributes.slidedeck.data[].slides[].desc.html
Tha n k you ! hidde.blog