Skip to content

[BREAKING CHANGE][Epic][a11y]: Доступность заголовков #4696

@eugpoloz

Description

@eugpoloz

Исследование невизуальной доступности выявило много проблем с заголовками, в частности:

  • ActionSheet: значения не должны быть заголовками
  • Group: заголовок не является заголовком
  • Header: нет заголовка и подзаголовка
  • ModalCardBase: второй заголовок не нужен
  • Placeholder: header и children оборачиваются в заголовки h2 и h4, которые, возможно, не нужны
  • Search: под полем присутствует заголовок h4 "Поиск", надобность которого не ясна
  • Snackbar: subtitle оборачивается в h5 заголовок, хотя не является им с точки зрения семантики

В чем глобальная проблема?

Некоторые типографические компоненты используют в своей основе теги заголовков, несмотря на то, что в реальности эти компоненты чисто визуальные:

  • Headline: дефолтный Component = 'h4',
  • Subhead: дефолтный Component = 'h5',
  • Title: Component привязан к level, хотя не должен быть.

При этом в абсолютном большинстве случаев этот Component изнутри компонента переопределить невозможно. Как выглядит, например, вышеупомянутый Placeholder:

{hasReactNode(header) && (
<Title level="2" weight="2" className={styles['Placeholder__header']}>
{header}
</Title>
)}
{hasReactNode(children) && (
<Headline weight="3" className={styles['Placeholder__text']}>
{children}
</Headline>
)}

Как можно решить?

Сейчас решить эту проблему можно только прокидыванием дополнительных пропсов практически к каждому компоненту (например, headerComponent — к header), в котором используется типографика.

-<Placeholder header="Уведомления от сообществ">
+<Placeholder
+  header="Уведомления от сообществ"
+  headerComponent="h2"
+>
  Подключите сообщества, от которых Вы хотите получать уведомления
</Placeholder>

Как промежуточное решение оно имеет право на существование, но по итогу — очень сильно замусорит пропсы и ухудшит DX.

Поэтому идеальный вариант — это переход на подкомпонентный подход к v6. Тогда, например, в тот же Placeholder вместо пропа header можно будет передавать <Placeholder.Header /> и задавать ему абсолютно все нужные пропсы:

-<Placeholder header="Уведомления от сообществ">
+<Placeholder>
+  <Placeholder.Header Component="h2">Уведомления от сообществ</Placeholder.Header>
  Подключите сообщества, от которых Вы хотите получать уведомления
</Placeholder>

Подкомпоненты мы можем делать уже сейчас, сохраняя обратную совместимость.

Также нужно подфиксить все проблемы конкретных типографических компонентов.

Что делаем?

И переводим сами компоненты на подкомпонентный подход, конечно. (%

Metadata

Metadata

Assignees

Labels

a11yДоступность (цифровая)a11y:auditПроблемы, найденные в ходе аудита невизуальной доступности VKUIbreaking-changecmp:typography

Type

Projects

Status

✅ Done

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions