Dev Lead Community Rewards
“If you’re not making it accessible, you’re excluding users.”
“Accessibility is not a feature — it’s a requirement.”
“Accessibility is for everyone.”
“The Web is for all people, on all devices, in all contexts.”
Using Web sockets wrong is worse than not using it at all
Using the Singleton Pattern wrong is worse than not using it at all
Walking wrong is worse than not walking at all
<html lang="en">
<!-- Content -->
</html>The lang attribute helps assistive technologies correctly interpret and pronounce text, ensuring users understand the content as intended.
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, viewport-fit=cover, user-scalable=no"
>Early mobile browsers struggled with poor support for responsive layouts and inconsistent CSS rendering, relying on fixed-width "desktop" assumptions that often caused unpredictable zooming and resizing.
<meta
name="viewport"
content="width=device-width, initial-scale=1"
>Blocking zoom disables important accessibility features, making it difficult for users—particularly those with low vision—to enlarge content for readability.
A clear page title helps users of assistive technologies quickly identify their location and improve navigation and accessibility.
Attributes that provide extra accessibility information to assistive technologies when native HTML isn’t enough
aria-label="Close"
aria-live="polite"
aria-disabled="true"
aria-selected="true"
aria-checked="false"
role="button"
role="dialog"
title="Help"
alt="George Washington Crossing the Delaware"
for="username"
id="tooltip-1"const castedNumberAsString = 77 as unknown as string<div role="button">
Not a Button
</div><div role="button">
Not a Button
</div><button>
Is a Button
</button><Typography
variant="subtitle2"
component="span"
onClick={onNextStatusClick}
>
{nextStatusText} Status
</Typography><Button
variant="text"
onClick={onNextStatusClick}
>
<Typography
variant="subtitle2"
component="span"
>
{nextStatusText} Status
</Typography>
</Button>alt attributeShort description of an image that is read aloud by assistive technologies when the image isn’t visible
<img
src="dog.png"
alt="Jack Russell jumping in the air"
>alt attributeA good `alt` text should communicate what is missed if you cannot visually see the image
<img
src="chart.png"
alt="Line chart showing sales rising 20% in Q4"
>alt text would you give?"George Washington standing in a boat leading Continental soldiers across the icy Delaware River during the Revolutionary War."
"'Washington Crossing the Delaware' by Emanuel Leutze, showing a dramatic, heroic composition with Washington at the center."
"'Washington Crossing the Delaware,' oil on canvas by Emanuel Leutze, 1851."
alt Text Golden RuleGood questions to ask:
If there was no image, what would I say instead?
Does this help the user?
Is the text short, accurate, and contextual?
Describe the meaning lost without the image
alt text, but...alt text can be empty<img src="confetti.png" alt=""><GiftCardImage alt={displayName} src={rewardCardImageUrl} />
<Typography>{displayName}</Typography><GiftCardImage alt="" src={rewardCardImageUrl} />
<Typography>{displayName}</Typography>The accessibility tree is the semantic structure of the page used by assistive technologies, beyond just the visual elements.
If it’s not meaningful in the accessibility tree, it’s not meaningful to users.
<Typography variant="h6">
{contentTitle}
</Typography>Creates ghost structure in the accessibility tree
Screen reader announces: “Heading level 6” with no content
Breaks navigation for users who jump by headings
{contentTitle && (
<Typography variant="h6">
{contentTitle}
</Typography>
)}<IconButton onClick={handleFilter}>
<SearchIcon />
</IconButton>
<IconButton onClick={handleFilterCancel}>
<CloseIcon />
</IconButton><IconButton onClick={handleFilter}>
<SearchIcon />
<VisuallyHidden>Search</VisuallyHidden>
</IconButton>
<IconButton onClick={handleFilterCancel}>
<CloseIcon />
<VisuallyHidden>Clear Search</VisuallyHidden>
</IconButton>export function VisuallyHidden({ style, ...props }: BoxProps<"span">) {
return (
<Box
component="span"
style={{
position: "absolute",
clip: "rect(0, 0, 0, 0)",
border: 0,
width: 1,
height: 1,
margin: -1,
padding: 0,
overflow: "hidden",
whiteSpace: "nowrap",
wordWrap: "normal",
...style,
}}
{...props}
/>
);
}aria-label is interpreted differently across screen reader and browser combinations, and in some cases:
It may be ignored if conflicting naming mechanisms exist
It may not update properly when changed dynamically
Its support varies across mobile vs. desktop and different screen reader/browser pairings
Translation tools like google translate are likely to ignore attributes
aria-label isn’t always reliable
Screen readers we just want the full text
Visually we want to hide the full text unless chosen
<label>
<VisuallyHidden>{fullText}</VisuallyHidden>
<span aria-hidden="true">
{expanded ? fullText : truncatedText}
<button onClick={()=>toggleExpansion()}>
view {expanded ? "less" : "more"}
</button>
</span>
</label> Accessibility isn’t a destination — it’s a habit.
Start small. Improve continuously.
We have set a quarterly audit schedule to start
You might do it more often or less often. What matters is that you start.
Treat accessibility issues like other bugs:
Prioritize user impact
Fix violations first and warnings next
Track accessibility tickets in your normal workflow
Tickets typically are low effort
Accessibility shouldn’t live in a separate backlog.
Chrome Extensions:
axe DevTools — Automated checks with actionable results
WAVE Evaluation Tool — Visual indicators on-page
*axe has a paid upgrade, but free tier is still powerful
(Thank you Steven for showing that you need a warning slide)
alt text?"