From c826d581ea58609e4b38ab91e0ec761362b71cb8 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 24 Aug 2026 05:32:10 +0000 Subject: [PATCH 1/4] =?UTF-8?q?=D0=9E=D1=82=D0=BA=D1=80=D1=8B=D1=82=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=B2=D0=BE=D0=BF=D1=80=D0=BE=D1=81=D1=8B:=20=D0=BF?= =?UTF-8?q?=D0=B0=D0=BD=D0=B5=D0=BB=D1=8C=20=D0=BD=D0=B0=D0=B4=20=D0=BA?= =?UTF-8?q?=D0=BB=D0=B0=D0=B2=D0=B8=D0=B0=D1=82=D1=83=D1=80=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=B2=20=D0=BF=D0=BE=D0=BB=D0=B5=20=D0=B2=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D0=B0,=20=D1=81=D1=82=D0=BE=D1=80=D0=BE=D0=BD=D0=B0=20=D1=81?= =?UTF-8?q?=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=B2=20?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D1=82=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit По итогам теста с реальными пользователями. Решений пока нет — оба пункта меняют текущее поведение (композер) и принятый макет ленты (ADR-024), нужно решение перед ADR и кодом. --- docs/open-questions.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/open-questions.md b/docs/open-questions.md index 8b3e929..b2dcbfe 100644 --- a/docs/open-questions.md +++ b/docs/open-questions.md @@ -5,5 +5,7 @@ - Серверный «перец» для ключевого блоба: дополнительное шифрование блоба серверным ключом, хранящимся вне базы. Плюс: дамп базы сам по себе перестаёт быть материалом для оффлайн-перебора. Минус: не защищает от оператора; потеря серверного ключа — невозможность входа с новых устройств для всех. Решение отложено. - Блокировка собеседника и персональные инвайты — если общего инвайт-кода и лимитов (ADR-019, ADR-021) окажется мало. - Подписи сообщений вторым ключом — если потребуется защита от сговора участника комнаты с сервером (ADR-016). +- Поле ввода — `textarea` в мобильном Safari поднимает системную панель навигации по полям («‹ ›» и «готово») над клавиатурой: живой экран съедает лишние ~50 px, обжито пользователями плохо. Направление — заменить на `contenteditable`-блок (`role="textbox"`, `aria-multiline="true"`): у него этой панели нет, а клавиатура остаётся текстовой. Ручная работа взамен браузерной: placeholder, счётчик и обрезка на 4000 символов, автовысота, `paste` только как текст — без этого блока `innerHTML` в него попадёт вставкой, а `innerHTML` в клиенте запрещён (CLAUDE.md). Enter/Shift+Enter и `isComposing` — переносятся как есть. Решение отложено: выбрать между этим и более дешёвым вариантом (поле вне `
`, `autocomplete="off"`) — если он снимает панель хотя бы в Safari, возни меньше. +- Выравнивание сообщений по стороне: свои — вправо, чужие — влево, как в обычных мессенджерах. Сейчас лента — общий список с колонкой автора (`docs/ui.md`, «Чат»; `docs/identity/brief.md`, «Компоновка»: сетка `132px 1fr` на десктопе, автор над группой на мобильном) — сторона у сообщения не задана нигде. Пользователям в тесте медленно читать, кто есть кто. Смена — это пересмотр принятого в ADR-024 макета ленты, нужен новый ADR, если решение — делать. Ограничение айдентики: без пузырей, скруглений и теней (`identity/brief.md`) — выравнивание, не bubble-чат. Закрыто ADR-015…024: регистрация, контакты, лимиты, смена пароля, идентификация устройств, язык интерфейса, айдентика, доверие к ключам, протокол, схема базы, деплой, правила пушей. From 334ce959350a63ec653f16eb93d6478fd08c3219 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 24 Aug 2026 06:10:18 +0000 Subject: [PATCH 2/4] =?UTF-8?q?ADR-064:=20=D1=81=D1=82=D1=80=D0=BE=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B2=D0=B2=D0=BE=D0=B4=D0=B0=20=D1=87=D0=B0=D1=82?= =?UTF-8?q?=D0=B0=20=E2=80=94=20div=20=D0=B2=D0=BC=D0=B5=D1=81=D1=82=D0=BE?= =?UTF-8?q?=20form?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Убирает системную панель навигации по полям над клавиатурой на iOS (Safari и Chrome): она держится на элементе , а не на textarea как таковом. Дешёвый вариант вместо contenteditable — сначала пробуем его, дороже (переписывать paste/placeholder/лимит руками) не потребовалось. Отправка теперь идёт по click на кнопке и по keydown Enter вместо события submit — форму убрали, role="form" держит ту же семантику для скринридера. --- docs/decisions/064-composer-not-form.md | 28 +++++++++++++++++++++++++ docs/open-questions.md | 1 - web/js/ui/chat.js | 19 ++++++++++------- 3 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 docs/decisions/064-composer-not-form.md diff --git a/docs/decisions/064-composer-not-form.md b/docs/decisions/064-composer-not-form.md new file mode 100644 index 0000000..172c7b2 --- /dev/null +++ b/docs/decisions/064-composer-not-form.md @@ -0,0 +1,28 @@ +# ADR-064: строка ввода — div, а не form + +Уточняет `docs/ui.md`, «Доступность»: `form` в списке семантики держит `role="form"`, а не элемент ``, — для строки ввода чата. + +## Контекст + +Тест с реальными пользователями (iPhone, Safari и Chrome): над клавиатурой при фокусе в строке ввода всплывает системная панель навигации между полями — «‹ ›» и «готово», около 50 px. Полю переходить некуда — оно на экране одно, — а место съедено. + +Панель — не наша вёрстка, это поведение WebKit для полей, лежащих внутри ``. Строка ввода была оформлена именно так: `` с `