Отзыв с iPhone после первого живого прогона. Масштабирование запрещено (ADR-066): viewport как в соседнем sixlines плюс viewport-fit=cover, мета-теги установленного приложения, touch-action против двойного тапа и страховка на JS — гашение жестов iOS, потому что мета-строку Safari вправе проигнорировать. Размеры шрифтов не тронуты: 14 px из брифа остаются, поднимать поля до 16 px владелец отклонил. Цена — доступность для тех, кому зум нужен — записана в ADR и в ui.md честно. Версия в подвале (ADR-065, 067): GET /api/config отдаёт короткую ревизию и время коммита. Именно коммита, а не сборки: штамп компиляции в бинаре means каждая пересборка даёт новый хеш, и обещание ADR-022 «бинарь собирается из тега байт в байт» перестаёт проверяться. Самообновление PWA (ADR-068, 070): в режиме приложения на iPhone перезагрузки нет, и старая версия жила бы вечно. Проверка при возврате в приложение, включение ждущей оболочки, перезагрузка — но не тогда, когда в строке набран текст. Замок от петли сравнивает версию оболочки, а не считает перезагрузки: счётчик отменял саму фичу, долгоживущая вкладка переставала обновляться. Замерено: было 30, 60, 120, 240 секунд между релизами, стало ровно 30. Строка ввода — редактируемый блок (ADR-069): iOS рисует над клавиатурой полосу со стрелками и «готово» для полей формы, и убрать её со страницы нельзя. Для contenteditable не рисует. Режим plaintext-only с проверкой, что он применился, и запасным путём с разбором вставки: невалидное значение атрибута в части браузеров делает блок нередактируемым вовсе. Чтение и запись только через textContent, innerHTML в клиенте по-прежнему нет. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015DbCjVfTFq4ZFG8juD45YJ
3.9 KiB
Айдентика «Скобы»
Источник — исследование «Исследование айдентики Bare» (Claude Design), вариант 1h и мок чата 2a/2b. Здесь — то, что из него принято (ADR-024).
Знак
Четыре угла рамки, из которой вынули содержимое. Пустота внутри и есть знак. Файл — mark.svg (viewBox 64, штрих 7); для 16 px штрих 9 (web/icons/mark.svg).
Правила: внутрь рамки ничего не помещать; не скруглять; не замыкать в квадрат; не наклонять и не анимировать; один цвет на знак; охранное поле — длина одного уголка. На тёмном и акцентном фоне знак всегда bone.
Wordmark — слово bare строчными рядом со знаком, тем же шрифтом, что интерфейс. «Bare» с заглавной — только в тексте.
Цвет
| имя | значение | роль |
|---|---|---|
| bone | #F7F5F0 |
фон |
| ink | #1B1917 |
текст, рамки, активный элемент |
| text2 | #3C3B38 |
вторичный текст |
| mute | #6E6D68 |
авторы, подписи |
| stone | #A9A59D |
время, placeholder, pending |
| line | #E7E3DA |
разделители |
| edge | #DEDCD6 |
внешние границы |
| mark | oklch(55% 0.19 20), fallback #C82D40 |
один акцент: непрочитанные, «новые», > ввода, свой ник, предупреждения |
Акцент — не чаще одного смыслового элемента на экран. Не для кнопок и заливок. Никаких градиентов, теней, скруглений.
CSS-переменные: --bone --ink --text2 --mute --stone --line --edge --mark.
Шрифт
Один: системный моноширинный.
font-family: ui-monospace, "SF Mono", Menlo, Consolas, "DejaVu Sans Mono", monospace;
Размеры: текст сообщений 14 px / 1.55; автор и время 12 px; заголовки секций 10 px, разрядка 0.14em, uppercase; подписи 11 px; имя чата в шапке 15 px. Шрифты не загружаются.
Поля ввода — те же 14 px, исключений нет: масштабирование в клиенте запрещено, и растить шрифт ради обхода фокус-зума iOS не приходится (ADR-066).
Компоновка
- Десктоп: сайдбар 224 px с правой границей
line, шапка 64 px, отступы контента 32 px; сообщения — сетка132px 1fr, column-gap 20, row-gap 6. - Мобильный: шапка 56 px, отступы 20 px, ввод с min-height 44 px. Нижнее поле подвала и строки ввода считается с
env(safe-area-inset-bottom): под системную полосу iPhone они не заходят (ADR-066). - Ввод — рамка 1 px ink, без скруглений,
>цветом mark слева. - Активный элемент списка — инверсия: фон ink, текст bone.
- Разделители — 1 px
line; разделитель «новые» — 1 px mark.
Голос
Короткие фразы, строчные буквы, без восклицаний и маркетинга. Ошибки говорят, что случилось и что делать. Примеры в docs/ui.md.