Location 26.700.0: маршрут чек-инов сворачивается по геометрии карты
Карта чек-инов получила новые маркеры, кластеры и правила сворачивания маршрута. Обновление заметят пользователи мобильного учёта рабочего времени и разработчики, которые интегрируются с JS-расширениями location.check-in и location.osm.
Новое
Маршрут учитывает свободное место на карте
В версии 26.700.0 появилось сворачивание маршрута по расстоянию между маркерами. Код проверяет, помещаются ли они раздельно. Если места не хватает, карта скрывает точки, связанные линии и стрелки направления, оставляя pin сотрудника или финишный диск с числом чек-инов. Сворачивание срабатывает только при наличии итогового маркера, поэтому маршрут не исчезает целиком.
После изменения масштаба карта отправляет хосту событие cameraChanged, чтобы тот пересобрал группы близких точек. В MapLibre клик по оставшемуся pin содержит collapsed: true; Leaflet передаёт только ID маркера и координаты. Хост MapLibre может отличить такой клик от выбора одиночной отметки и открыть данные за весь день.
Кластеры складывают фотографии сотрудников
Близкие ручные и автоматические отметки теперь собираются в один числовой диск. Кластеры сотрудников и офисов раскладывают от двух до восьми фотографий, а переполнение показывают через +N. Список участников прокручивается по кругу. В DOM одновременно создаётся не более 16 изображений, причём отложенные фотографии загружаются перед показом.
Выбранные сотрудник и офис меняют круглый маркер на pin. Для активных объектов появились свечение и последовательное дрожание, начало и конец маршрута получили отдельные glyph-маркеры. При первом появлении маркеры MapLibre падают сверху за 450 мс. Настройка prefers-reduced-motion отключает эту анимацию.
Под нативной заставкой карта удерживает новые маркеры до общего старта, чтобы они появились одновременно. Отдельный сценарий синхронизирует их при открытии маршрута.
Стрелки направления больше не перекрывают маршрут
Маленькие chevron-стрелки заменены длинными heading-стрелками MapLibre. Перед показом карта проверяет длину прямого участка, пересечения с линиями и наложение стрелок друг на друга. Выбор пересчитывается после изменения масштаба, поворота и наклона. Стрелки скрываются, пока маршрут строится, свёрнут или целиком помещается на экране.
Тёмная карта теперь рисует одни OSM-тайлы двумя слоями: ground отвечает за фон, полупрозрачный ink сохраняет белые подписи и цветные дороги. Grayscale применяется к обоим слоям, а плавное проявление тайлов отключено.
Фотографии проходят строгую проверку
Прямой <img> принимает только HTTP(S) или допустимый путь внутри портала. Код отвергает управляющие символы, пробелы, protocol-relative URL и остальные схемы, а атрибуты экранирует. Если фотографии нет, карта строит SVG-заглушку. Не загрузившееся изображение офиса заменяется иконкой здания.
Замена срабатывает и для изображений, добавленных после первого рендера. Обработчик работает на capture-фазе, а MutationObserver замечает новые узлы. Поэтому офис не остаётся с пустым или повреждённым аватаром после обновления кластера.
В location.check-in появились дополнительные экспорты для расчёта стрелок, кластеров и геометрии маршрута. MarkerIconFactory принимает необязательные параметры цвета пути, количества чек-инов и состояний live и tremble. В location.osm экспортирован RouteLayerTestRegistry, который создаёт скрытые data-testid-узлы для UI-тестов. Эти экспорты видны в сборке, но обновление не объявляет их стабильным публичным контрактом.
Мелочи и находки
Leaflet-движок передаёт расширенную палитру хоста через CSS-переменные интерфейса чек-инов. Внутренняя HTML-разметка и размеры маркеров изменились, поэтому кастомные стили и UI-тесты с привязкой к старым классам стоит перепроверить после обновления.