Разработчики с зрением часто ошибочно полагают, что любой терминальный интерфейс автоматически доступен слепым. Это миф. Реальность в том, что многие современные текстовые интерфейсы (TUI), созданные для улучшения опыта разработки, активно мешают доступным пользователям. Проблема кроется в архитектурной разнице между классическими CLI и TUI.
В CLI работает линейный поток данных: пользователь вводит команду, и результат появляется ниже. Это идеально для скринридеров вроде Speakup. TUI же воспринимает экран как двумерную сетку пикселей, где каждый символ — это точка в пространстве, а не временной отрезок. Взять тот же gemini-cli, написанный на Node.js с помощью фреймворка Ink. При обновлении состояния приложения, например во время ожидания ответа от ИИ, система перерисовывает всё экранное пространство. Это вызывает хаос. Скринридер слышит непрерывный поток сообщений: «Responding...», таймеры, фрагменты чата. Курсор телепортируется по всему экрану, перепрыгивая между спиннерами и историей, делая ввод невозможным.
Ситуация усугубляется на платформах вроде Windows с NVDA. Передача данных в такой среде часто приводит к крашу скринридера или нестабильности системы. Причина одна: каждый нажатие клавиши или вставка текста вызывает полное пересчет и перерисовку состояния. Если история диалога длинная, обработка займет до 10 секунд на печать одного символа, так как система занята ререндерингом. Разработчики часто спрашивают, почему тогда работают nano, vim или menuconfig. Ответ прост: в этих инструментах можно скрыть курсор. В nano или vim, если активировать отображение позиции курсора, скринридер вместо буквы «a» выдаст «Column 2». Доступность теряется. Эти старые утилиты выживают за возможность отключить визуальный шум. Современные фреймворки редко предлагают режим без курсора, считая его обязательным элементом.
Хорошим примером правильного подхода служит Irssi. Этот чат-клиент использует VT100 Scrolling Regions. При новом сообщении он просит драйвер терминала прокрутить область скроллинга и написать текст снизу, не пересчитывая состояние каждого символа. Это гораздо эффективнее. Даже Google и авторы gemini-cli嘴上说 заботятся о доступности, но критические баги, вроде Issue #3435 и Issue #11553, остаются без внимания. Более того, отчет Issue #1553 был автоматически закрыт ботом с текстом о наведении порядка в очереди, хотя проблема не была решена. Это способ скрыть факт неосуществимости использования софта.
Если вы создаете приложение для терминала, откажитесь от декларативных UI-фреймворков, превращающих терминал в канвас. Современный стек TUI жертвует производительностью вывода текста ради удобства написания кода в стиле React. Если не гарантировать возможность скрыть курсор или использовать агрессивную перерисовку для спиннеров, инструмент будет недоступен. Для слепых пользователей простой линейный поток CLI бесконечно лучше «умного» TUI, который лагает, генерирует шум и разбрасывает курсор по экрану.