--- type: trz work_item_id: ET-002 title: "ТЗ: Чекбокс показа/скрытия POI в попапе рельефа" version: 1 status: approved created_at: 2026-05-20 authors: - "agent:analyst" --- # ТЗ — ET-002: Чекбокс показа/скрытия POI в попапе рельефа ## 1. Функциональные требования ### REQ-F-01: Чекбокс POI в попапе рельефа Система должна отображать чекбокс «POI» в попапе кнопки «Рельеф» (`terrain-popup`), расположенный после чекбокса «Тропы» (`trails-path-cb`), отделённый горизонтальной линией (`
`). ### REQ-F-02: Состояние по умолчанию При первом посещении (отсутствие ключа в localStorage) чекбокс POI должен быть включён (checked), маркеры POI видимы. ### REQ-F-03: Скрытие POI При снятии чекбокса система должна установить `visibility: 'none'` для слоёв `poi-circles` и `poi-labels` через `map.setLayoutProperty()`. ### REQ-F-04: Показ POI При установке чекбокса система должна установить `visibility: 'visible'` для слоёв `poi-circles` и `poi-labels`. ### REQ-F-05: Сохранение состояния Система должна сохранять состояние чекбокса в `localStorage` под ключом `poi-visible` (значения: `'1'` — показывать, `'0'` — скрывать). ### REQ-F-06: Восстановление состояния при загрузке При загрузке страницы система должна: 1. Прочитать значение `localStorage.getItem('poi-visible')` 2. Если значение `'0'` — снять чекбокс и скрыть слои POI 3. Если значение `'1'` или отсутствует (null) — установить чекбокс и показать слои POI ### REQ-F-07: Синхронизация с layerState Изменение чекбокса должно обновлять `layerState.poi` (true/false), чтобы состояние было консистентно с внутренней моделью приложения. ## 2. Нефункциональные требования ### REQ-NF-01: Производительность Переключение видимости POI должно происходить мгновенно (< 50 мс), без перезагрузки тайлов. ### REQ-NF-02: Совместимость Решение должно работать во всех браузерах, поддерживающих MapLibre GL JS (Chrome 80+, Firefox 78+, Safari 14+, Edge 80+). ### REQ-NF-03: Мобильная адаптация Чекбокс должен быть доступен и нажимаем на мобильных устройствах (touch target ≥ 44px). ### REQ-NF-04: Отсутствие регрессий Существующие чекбоксы (Тени рельефа, Перепады, Грунтовки, Тропы) должны продолжать работать без изменений. ## 3. UI-спецификация ### Расположение в HTML ```html
``` ### Стилизация Использовать существующий класс `terrain-checkbox` — единообразие с остальными чекбоксами в попапе. ## 4. Данные - localStorage ключ: `poi-visible` - Значения: `'1'` (показывать) | `'0'` (скрывать) - MapLibre слои: `poi-circles`, `poi-labels` - Состояние в JS: `layerState.poi` ## 5. API Нет изменений в backend API. Вся логика — клиентская. ## 6. Затрагиваемые файлы | Файл | Изменение | |------|-----------| | `src/web/index.html` | Добавить чекбокс в `terrain-popup` | | `src/web/app.js` | Добавить функцию `onPoiCheckbox()`, логику восстановления состояния при загрузке |