Skip to main content
Yosavo Studio by Youssef Ibaichou , home
Expertise

Web Accessibility

Accessibility has become part of how I approach engineering, not a final compliance task. My experience includes accessible development, WCAG implementation, accessibility auditing, remediation and working on accessibility-focused SaaS products.

Semantic HTML · Keyboard & focus · Manual testing · WCAG

How I think about it

How I think about accessibility

Accessibility works best when it is considered during design and engineering. Fixing accessibility after a product is already built is usually slower, more expensive and less consistent.

  • Native HTML first. A large share of accessibility bugs is a div pretending to be a button.
  • Every interaction must work with a keyboard and announce its state.
  • Automated tools find a subset of issues; keyboard and screen-reader testing find the rest.
  • Fix the shared component once and every screen that uses it improves.

Key experience

Where this comes from

  • Lead delivery of Nexus Inclusion, an accessibility SaaS platform for identifying, managing and improving digital accessibility.
  • Accessible web development on Bookshare Ireland, a platform supporting people with print disabilities.
  • WCAG-focused accessibility audits and remediation, combining automated scans with manual keyboard and screen-reader testing.

Scope

What I know

  • Semantic HTML & landmarks
  • ARIA, used sparingly
  • Keyboard interaction
  • Focus management
  • Accessible forms & errors
  • Screen reader behaviour
  • Accessible SPAs
  • Contrast & visual states
  • Tables & complex widgets
  • Automated vs manual testing
  • WCAG principles
  • Accessibility in delivery

Deep dive

Web Accessibility in practice

On this page (12 topics)

Semantic HTML

The most effective accessibility work is choosing the right element. A <button> is focusable, activates with Enter and Space and announces itself as a button — for free. A <div> with a click handler needs all of that rebuilt, and usually doesn't get it.

Links go somewhere; buttons do something. Headings describe the structure of the page, not the font size. Landmarks such as header, nav, main and footer let screen-reader users jump straight to what they need, and every form field needs a programmatic label — placeholder text is not one.

Native button compared with a clickable div
<!-- Focusable, works with Enter and Space, announced as a button -->
<button type="button" aria-expanded="false" aria-controls="filters">
  Filters
</button>

<!-- None of that comes for free -->
<div class="btn" onclick="toggleFilters()">Filters</div>

ARIA

ARIA should support semantics, not replace correct HTML. It changes what assistive technology is told, not how the element behaves: role="button" doesn't make anything keyboard-operable, and aria-expanded doesn't open anything. Wrong ARIA is worse than none, because it makes promises the interface doesn't keep.

I reach for ARIA when HTML has no native equivalent: states such as aria-expanded, aria-selected and aria-current; relationships such as aria-describedby for hints and errors; and live regions for status updates. Every attribute added is one more thing the code must keep in sync.

Keyboard accessibility

Everything usable with a mouse must be usable with a keyboard, in an order that matches the visual layout. My first test is simple: put the mouse away. Can I reach every control, see where focus is, operate it and leave it again?

Custom controls need the keys people expect — Escape closes, arrow keys move within menus, tabs and listboxes — and focus indicators must be clearly visible. Removing outlines without a replacement is one of the most common regressions I see.

Focus management

In dynamic interfaces focus has to be managed on purpose. A modal moves focus inside when it opens, keeps it there, closes with Escape and returns focus to the control that opened it. After a client-side route change, focus and an announcement should tell the user the page changed. When content is removed, focus shouldn't silently fall back to the top of the document.

Forms

Forms are where accessibility failures cost the most, because they block the task itself. Every field needs a visible label tied to the input, instructions before the field rather than after a failed submission, and required fields indicated in text, not only by colour.

Errors should be specific — “Enter an email address, for example [email protected]” — connected to the field with aria-describedby, and surfaced on submit by moving focus to the first problem, so a screen-reader user knows something went wrong and where.

Screen readers

A screen reader experiences the page through the accessibility tree: names, roles, states and reading order. Testing means listening to what is actually announced. Is the button's name meaningful out of context? Is the new state announced when it changes? Does the reading order match the visual order?

Screen readers and browsers combine differently, so critical flows are tested with real assistive technology rather than assuming correct markup is enough.

Dynamic applications

React, Vue and other single-page applications make it easy to build interfaces that look right and are silent to assistive technology: content that updates without an announcement, modals that don't contain focus, route changes that leave focus on a link that no longer exists, notifications that disappear before they can be read.

The fix is usually a small set of well-built shared components — dialog, menu, tabs, toast, form field — plus live regions for status messages, used consistently across the product.

Related: React expertise

Colour & visual accessibility

Text needs sufficient contrast against its real background, including over images and gradients; interface components — input borders, focus rings, icons that carry meaning — need contrast too. Colour can't be the only signal: an error needs text or an icon as well as red.

Layouts should survive 200% zoom and increased text spacing without clipping or horizontal scrolling, and interactive states — hover, focus, selected, disabled — must be visibly distinct.

Tables & complex UI

Data tables need real table markup with header cells and a caption, not a grid of divs. For complex widgets — dialogs, menus, tabs, accordions, comboboxes — I follow established interaction patterns rather than inventing new ones, because people using assistive technology rely on that predictability.

Automated vs manual testing

Automated checkers are good at what can be computed: missing alternative text, missing labels, invalid ARIA, many contrast failures. They can't judge whether alternative text is meaningful, whether focus order makes sense, whether an error message helps, or whether a custom widget can actually be operated.

So every audit I run combines automated scans with manual keyboard testing and screen-reader checks. Many automated results also need human review — a tool can flag text on a gradient, but someone has to decide whether it is readable.

Automated tools are a starting point, not a verdict. A page can pass every automated rule and still be unusable with a keyboard.

WCAG

WCAG organises its requirements around four principles. The success criteria are testable, which makes them a useful shared language for designers, developers, QA and clients — as long as the goal stays real people completing real tasks, not a ticked checklist.

  • Perceivable — information can be perceived, whatever the sense used.
  • Operable — every interaction works, including with a keyboard.
  • Understandable — content and behaviour are predictable and clear.
  • Robust — markup works reliably with assistive technologies.

Accessibility in the engineering workflow

Accessibility holds up when it's part of the normal workflow rather than a phase at the end.

  • Design: contrast, focus states and error patterns decided up front.
  • Development: shared components built accessibly once.
  • Review: accessibility in code review and acceptance criteria.
  • Testing: manual keyboard and screen-reader checks on critical flows.
  • Regression prevention: automated checks in CI so fixed issues stay fixed.

In practice

Common problems I work with

  • Custom controls that can't be used with a keyboard
  • Modals and menus that lose or trap focus
  • Forms with missing labels and unhelpful error messages
  • Dynamic updates screen readers never announce
  • Insufficient contrast and colour-only status indicators
  • Audit reports that list issues without a realistic remediation plan

Real products

How it connects to real products

Accessibility runs through products I've delivered — including a platform whose whole purpose is improving accessibility.

See all selected work

Related expertise

React

Product interfaces: state ownership, API workflows, forms and accessibility.

  • State management
  • API integration
  • Forms
  • Accessibility

Vue.js

Vue product interfaces: component boundaries, composables, state and Laravel integration.

  • Composition API
  • State ownership
  • Laravel + Vue
  • Accessibility

WordPress

Custom themes, plugins and integrations — and knowing when WordPress fits.

  • Custom themes
  • Plugins
  • Accessibility
  • Security

SaaS Development

Tenancy, permissions, plans, billing and the realities of running SaaS in production.

  • Multi-tenancy
  • Permissions
  • Billing
  • Production delivery

Related services

Let's talk

Have a technical challenge?

Whether it's an architecture decision, a delivery problem or something specific to Web Accessibility, I can help you find a practical path forward.

What happens next

  1. Share your goal

    A few lines about the product, problem, or audit need.

  2. Get a quick read

    A practical reply on the best technical path forward.

  3. Move forward

    A clear scope, estimate, or concrete next step.