# Движение в интерфейсе

Добавлено 19.10.2026 для главной страницы, отдельных букетов, подборок и городов доставки. Ассеты локальные: `public/assets/motion.css` и `public/assets/motion.js`. Базовая сетка, тексты, фото, цены, настройки магазина и серверная логика не меняются.

- Секции и карточки появляются один раз при попадании в область просмотра: сдвиг 12 px, длительность 500 ms, короткая последовательность с задержкой до 96 ms.
- При наведении мышью карточка поднимается на 4 px, кнопка — на 2 px. Нажатие даёт короткий отклик. На сенсорных устройствах эффекты наведения отключены.
- Открытие диалогов занимает 240 ms. Их закрытие и управление фокусом остаются нативными; отправка форм не ждёт анимации.
- Смена фото в каталоге, модальном окне и отдельной карточке проходит через общий `LaFleurMotion.swapImage`: прежнее фото остаётся до загрузки нового, затем выполняется проявление 280 ms. Из нескольких быстрых запросов применяется последний. Ошибка/таймаут сохраняют прежнюю фотографию.

При `prefers-reduced-motion: reduce` движения и плавная прокрутка отключены, выполняющиеся анимации отменяются. Бесконечных анимаций, параллакса, scroll-listeners и внешних библиотек нет. Без JavaScript или поддержки анимаций контент сразу виден; исходный CSS не скрывает элементы в ожидании эффекта. Если motion-скрипт не загрузился, галереи продолжают напрямую менять `src`, как прежде.

Динамический каталог вызывает `LaFleurMotion.reveal(grid)` после отрисовки. Обработанные элементы учитываются через WeakSet, удалённые карточки снимаются с IntersectionObserver. Длительные фоновые анимации не запускаются, при скрытии вкладки текущие эффекты отменяются.

Проверки: PHP lint для четырёх шаблонов; `node --check` для motion/app/product-page JS; `tests/routes.php` по 20/20 на PHP-предпросмотре и Apache. `node tests/motion.cjs` — 27/27 проверок жизненного цикла и смены фото, включая ошибки, таймаут, быстрые запросы и удалённый из страницы товар. Выбор миниатюры подтверждается после успешной загрузки фото. В этой сессии доступны HTTP и проверка кода; визуальная проверка в браузере не выполнялась из-за ранее отклонённого доступа к локальному адресу.

Для полного отключения слоя убрать подключения `motion.css`/`motion.js` из `public/index.php`, `public/product.php`, `public/occasion.php`, `public/delivery.php`; обязательных изменений БД или настроек нет. Ссылки в коде галерей имеют обычный fallback, а вызов reveal необязателен.
