# ADR-053: Лента страницами по 50, без виртуализации списка Уточняет [ADR-009](009-local-history.md): пагинация курсором остаётся, виртуализация снимается. ## Контекст ADR-009 задаёт одной строкой две разные вещи: «пагинация курсором по ~50 сообщений, виртуализация списка в DOM». Первая — про данные и решает настоящую задачу: чат в десять тысяч сообщений не должен читаться из IndexedDB целиком при открытии. Вторая — про разметку, и её цена выяснилась только на этапе 5. Виртуализация требует знать высоту строки до отрисовки. В ленте её нет: текст переносится, на десктопе строка — две ячейки грида через `display: contents` (`docs/identity/brief.md`), сообщение бывает в одну строку и в тридцать. Значит нужны измерение каждой строки, распорки сверху и снизу и пересчёт при смене ширины окна. Платят за это не только кодом: `aria-live` на ленте (`docs/ui.md`, «Доступность») зачитывает появление и исчезновение строк, а поиск по странице и выделение текста перестают видеть то, что убрано из разметки. Выгоды при этом нет. В DOM попадает не вся история, а только то, что человек домотал прокруткой: открытие чата — 50 строк независимо от размера переписки. ## Решение - Виртуализации в v1 нет. В разметке живёт всё загруженное. - Лента открывается последней страницей в 50 сообщений и стоит в конце. - Прокрутка к верхнему краю берёт следующие 50 назад по индексу `chat` (`docs/storage.md`). Страница короче полной означает, что выше ничего нет. - Расстояние до низа при подгрузке сохраняется: то, что человек читает, не двигается. - Страница короче окна прокрутки события `scroll` не порождает, поэтому следующая берётся сразу — пока лента не заполнит окно или сообщения не кончатся. - Разделители дат и «новые» считаются по всему загруженному, а не по последней странице: граница «новых» уезжает вверх вместе с подгруженным. - Записано в `docs/ui.md` («Чат») и `docs/architecture.md`. ## Следствия - Домотавший до начала переписки в десять тысяч сообщений держит их все в разметке. Это его прокрутка и его выбор; обычное открытие чата — 50 строк. - Экранный диктор, поиск по странице и выделение работают как в обычном документе. - Возврат виртуализации — отдельный ADR, если появится жалоба, а не предположение.