From d80e70ae22419b8c82ee452ac865d42c877ccfce Mon Sep 17 00:00:00 2001 From: Nikita Date: Fri, 4 Sep 2026 00:28:01 -0300 Subject: [PATCH] docs: functional description of the web inbox for design Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01BCrwHHnGCB5XH968Nxokqw --- docs/design/2026-09-04-inbox-functional.md | 130 +++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 docs/design/2026-09-04-inbox-functional.md diff --git a/docs/design/2026-09-04-inbox-functional.md b/docs/design/2026-09-04-inbox-functional.md new file mode 100644 index 0000000..df54613 --- /dev/null +++ b/docs/design/2026-09-04-inbox-functional.md @@ -0,0 +1,130 @@ +# Hado · веб-инбокс — функциональное описание для дизайна + +Что есть на экранах и что делает каждый элемент. Без визуальных требований: +размеры, цвета, сетка, стиль — на стороне дизайна. + +## Контекст + +Hado — сервис напоминаний. Другие сервисы (документы, люди, оплаты) присылают ему +события со сроком, Hado сам решает, когда и куда напомнить: сюда в инбокс, в Telegram, +в умный дом. Веб-инбокс — единственный экран Hado. Пользователь попадает в него уже +залогиненным через общий вход экосистемы, своей формы логина здесь нет. + +Два действия над событием, они принципиально разные и должны читаться по-разному: + +- **«Помню»** — «я в курсе, отстань до следующей контрольной точки». Событие остаётся, + счётчик не меняется. Напоминание вернётся само: в день события через час, до события + на следующей контрольной точке, после события через день. +- **«Сделано»** — «закрыл вопрос». Событие уходит с экрана навсегда, счётчик падает. + Подпись кнопки может задавать сервис-источник: «Поздравил», «Оплатил», «Продлил». + По умолчанию «Сделано». + +## Понятия + +| термин | что это | +|---|---| +| Событие | одна штука со сроком: ДР Васи, седула протухает 30 сен, вылет 10 сен 08:15 | +| Срок | день события, иногда с конкретным временем | +| Источник | сервис, который прислал событие (`docs`, `people`). Показывается как подпись | +| Счётчик | число событий в группах «Сегодня» и «Просрочено». Это же число потом будет бейджем на иконке iOS | +| Ссылка в источник | у события может быть ссылка на объект в сервисе-источнике (карточка человека, документ) | + +## Экран 1. Инбокс (главная и единственная страница) + +### Шапка +- Название «Hado». +- Счётчик: число событий «Сегодня» + «Просрочено». Если ноль — не показывается. +- Заголовок вкладки браузера дублирует счётчик: «(3) Hado», чтобы видеть его в списке вкладок. + +### Группы событий +Четыре группы, всегда в этом порядке. Пустая группа показывает подпись «Пусто» +(или скрывается — решение дизайна, но порядок остальных не меняется). + +1. **Сегодня** — срок сегодня, время ещё не наступило. Самое важное, наверху. +2. **Просрочено** — срок прошёл, но событие всё ещё надо сделать (седула истекла, + аренда не оплачена). Висит, пока не нажмёшь «Сделано». +3. **Грядёт** — идёт подготовка, срок через дни или недели. В счётчик не входит. +4. **Запланировано** — Hado про событие знает, но ещё молчит. В счётчик не входит. + +Внутри группы события отсортированы по сроку, ближайший первым. + +### Карточка события +- **Заголовок** — текст от источника («Сегодня ДР — Вася»). Если у события есть ссылка + в источник, заголовок — ссылка, открывает объект в сервисе-источнике (в той же вкладке + или новой — решение дизайна). +- **Подзаголовок** — вторая строка от источника, опциональная («исполняется 34», + «осталось 30 дней»). +- **Служебная строка** — имя источника и срок: «docs · срок 2026-09-30». Если срок с + временем — «2026-09-10 08:15». +- **Кнопка «Помню»** — есть во всех группах, кроме «Запланировано» (там напоминаний + ещё нет, «помнить» нечего). После нажатия карточка остаётся на месте, ничего + визуально не должно намекать, что событие закрыто. +- **Кнопка «Сделано»** — есть везде, включая «Запланировано» (закрыть можно заранее, + хоть за два месяца). Подпись берётся у источника, если он её задал. После нажатия + карточка исчезает, счётчик уменьшается, если событие было в «Сегодня» или «Просрочено». + +Нажатие любой кнопки: кнопка блокируется до ответа сервера, затем список обновляется. +При ошибке кнопка разблокируется, карточка остаётся. + +### Блок «Настройки» +Свёрнут по умолчанию, раскрывается на той же странице. В заголовке блока — логин +пользователя. + +**Пояс и тихие часы** +- Выбор часового пояса из полного списка (IANA: `America/Montevideo`, `Asia/Shanghai`). + Пользователь много переезжает и меняет пояс руками; все напоминания сдвигаются под него. +- Тихие часы: «с» и «до». По умолчанию с 22:00 до 09:00. В тихие часы Hado молчит во + всех каналах. Ограничение: интервал обязан переходить через полночь («с 22:00 до + 09:00» верно, «с 08:00 до 22:00» — ошибка, показать сообщение). +- Кнопка «Сохранить». После сохранения страница обновляется. + +**Каналы** — куда Hado доставляет напоминания. Список: +- **Веб** — этот инбокс. Есть всегда, удалить нельзя, кнопки удаления нет. Подпись + «этот инбокс». +- **Telegram** — подпись с идентификатором чата. Появляется после привязки (ниже). + Кнопка «Удалить». +- **Webhook** — адрес, куда Hado шлёт напоминание (в жизни это умный дом). Подпись — + сам адрес. Кнопка «Удалить». Таких может быть несколько. + +**Добавить webhook** — форма из двух полей и кнопки: +- «Адрес доставки» — куда Hado отправит напоминание. +- «Адрес присутствия» — откуда Hado спросит «пользователь сейчас дома/рядом?». +- Кнопка «Добавить webhook». Оба поля обязательны, должны быть URL. Ошибки валидации + показываются у формы. + +**Подключить Telegram** — кнопка. По нажатию появляется одноразовый код и ссылка на +бота: «Отправь боту `/start ABC123` или открой». Код живёт 15 минут. После того как +пользователь отправит код боту, канал Telegram появится в списке (при следующем +открытии страницы). + +### Поведение страницы, невидимое пользователю +- Пока вкладка открыта, видима и пользователь что-то делал за последние 3 минуты, + страница сообщает серверу «я тут». Hado тогда не дёргает Telegram и умный дом: + напоминание считается доставленным в инбокс. Забытая фоновая вкладка «я тут» не + сообщает. +- Никаких всплывающих уведомлений и звуков в самом инбоксе нет: он пассивный экран. + Активные каналы — Telegram и умный дом, потом iOS. + +## Экран 0. Нет доступа +Если пользователь пришёл не через общий вход экосистемы, страница не открывается +(ответ 401). Своей заглушки у Hado нет: общий вход сам перебросит на форму логина. +Дизайнить здесь нечего, упомянуто для полноты. + +## Вне веба, но для консистентности + +**Сообщение в Telegram** — текст: заголовок и подзаголовок события. Под ним две кнопки: +«Помню» и «Сделано» (или подпись источника). После «Сделано» кнопки под сообщением +убираются. Каждое новое напоминание — новое сообщение, старые не редактируются. +Ответы бота на нажатия: «Ок, напомню позже», «Закрыто», «Уже неактуально». + +**Умный дом (webhook)** получает те же поля: заголовок, подзаголовок, источник, срок, +подпись кнопки «Сделано» и две ссылки-действия. Как это озвучивается или показывается — +на стороне умного дома. + +## Чего здесь нет намеренно +- Истории закрытых событий: закрыл — исчезло, архива нет. +- Ручного создания событий: их присылают только сервисы-источники. +- Откладывания «на дату»: этим занимается правило «Помню». +- Настройки частоты напоминаний: она общая и не настраивается. +- Мобильного приложения: iOS с бейджем, виджетом «Грядёт» и Live Activity — отдельный + проект, его описание будет отдельно.