Maya Shavin
Senior Software Engineer
See
🦻
Hear
Understand
⌨️
Use/Navigation
See
🦻
Hear
Understand
⌨️
Use/Navigation
Perceivable
Operable
Understandable
Robust
With or without CSS-in-JS
Semantic HTML Tags
Focus management
Screen Reader support (WAI-ARIA etc)
Dynamic Content
Magnification support (200%, 400%)
Landmarks/Regions
& Headings
table
h1-h7
article
header
footer
nav
dialog
button
a
input
Parse CSS
Inject to Stylesheet
stylesheet.insertRule
HTML Paint
load
download
✅ Keep the heading order structure (h1 - h7)
✅ Use CSS order to re-arrange the appearance
<button
aria-label="Place an order"
>
Order
</button>
<button
aria-label="Place order button"
>
Order
</div>
Place an order, button
Place order button, button
aria-label vs aria-labelledby
<dialog role="dialog" aria-label="Sample Modal">
<header>
<h2 id="header-title">
Sample Modal
</h2>
</header>
<main>
<p id="description">
This is the content
</p>
</main>
<footer>
<button aria-label="close dialog">
Close
</button>
</footer>
</dialog>
<dialog role="dialog" aria-labelledby="header-title">
<header>
<h2 id="header-title">
Sample Modal
</h2>
</header>
<main>
<p id="description">
This is the content
</p>
</main>
<footer>
<button aria-label="close dialog">
Close
</button>
</footer>
</dialog>
<Badge>
Item Two
<BadgeIcon
aria-label="Badge count 6"
role="status"
>
6
</BadgeIcon>
</Badge>
Item two, badge count 6
✍️ Visible and understandable label
✅ Clear ARIA role when needed
👷♂️ Interactive value (aria-disabled, aria-selected, etc)
🗒️ Concise description as hints (don't use title)
Working with screen reader
<Badge className="v-badge theme--dark">
Item Two
<BadgeIcon
aria-atomic="true"
aria-live="polite"
aria-label="Badge count 6"
role="status"
>
6
</BadgeIcon>
</Badge>
200% - 400% Zoom
Text readability
Contrast/Color
Layout consistency
What is component's type?
Focus & navigation behavior
Component internal flow and external flow
Component stylings
Interactivity
@mayashavin
mayashavin.com