Carbon Components Svelte построена с учётом принципов доступности (Accessibility, A11y). Каждый компонент содержит встроенные атрибуты ARIA, семантическую разметку и поддерживает клавиатурную навигацию. Это позволяет создавать интерфейсы, которые корректно воспринимаются скринридерами и другими вспомогательными технологиями.
Основные элементы, на которые стоит обратить внимание:
aria-label, aria-expanded,
aria-checked).Tab, Enter, Space и стрелочные
клавиши.button, input, select) там, где
это возможно, вместо кастомных решений, что повышает доступность по
умолчанию.Для проверки доступности интерфейсов можно использовать следующие инструменты:
jest-axe.Пример интеграции axe-core с тестом компонента:
import { render } from '@testing-library/svelte';
import { axe, toHaveNoViolations } from 'jest-axe';
import Button from '../src/Button.svelte';
expect.extend(toHaveNoViolations);
test('Button не имеет нарушений доступности', async () => {
const { container } = render(Button, { props: { label: 'Нажми меня' } });
const results = await axe(container);
expect(results).toHaveNoViolations();
});
Правильная последовательность фокусировки обеспечивает удобную навигацию клавиатурой. Для проверки фокусного порядка:
Tab для перехода между
интерактивными элементами.Dropdown или
Modal, убедиться, что фокус корректно ограничен внутри
открытого модального окна (focus trap).Пример реализации focus trap в Svelte:
<script>
import { onMount } from 'svelte';
let modal;
let firstFocusable;
let lastFocusable;
onMount(() => {
const focusableElements = modal.querySelectorAll(
'a[href], button, input, select, textarea, [tabindex]:not([tabindex="-1"])'
);
firstFocusable = focusableElements[0];
lastFocusable = focusableElements[focusableElements.length - 1];
firstFocusable.focus();
modal.addEventListener('keydown', (e) => {
if (e.key === 'Tab') {
if (e.shiftKey && document.activeElement === firstFocusable) {
e.preventDefault();
lastFocusable.focus();
} else if (!e.shiftKey && document.activeElement === lastFocusable) {
e.preventDefault();
firstFocusable.focus();
}
}
});
});
</script>
<div bind:this={modal} role="dialog" aria-modal="true">
<button>Закрыть</button>
<input placeholder="Введите текст" />
<button>Сохранить</button>
</div>
Каждый компонент Carbon имеет встроенные атрибуты и поддержку событий для доступности:
aria-pressed для
toggle-кнопок, правильная реакция на Enter и
Space.aria-label или aria-labelledby, управление
ошибками через aria-invalid и
aria-describedby.role="dialog",
aria-modal="true", возможность закрытия через
Escape.aria-expanded, aria-controls, поддержка клавиш
стрелок для навигации по списку.Для командной разработки рекомендуется включать проверку доступности в CI:
jest и
@testing-library/svelte.jest-axe для всех интерактивных
компонентов.Пример конфигурации CI:
{
"scripts": {
"test:a11y": "jest --config=jest.a11y.config.js"
}
}
Некоторые аспекты доступности невозможно проверить автоматически:
Тщательное соблюдение этих принципов гарантирует, что приложения на Carbon Components Svelte будут доступны и удобны для всех пользователей.