Половина интернет-магазинов и каталогов открывает карточки через модалки на `useState`. Красиво, быстро — и полностью невидимо для поискового робота. Адрес не меняется, `` не меняется, canonical ведёт на список. Каждая карточка технически существует, но в индексе её нет.
Паттерн с Parallel Routes и Intercepting Routes в Next.js App Router закрывает эту дыру. При переходе из списка карточка открывается модалью, при прямом запросе или reload — как обычная страница. Один URL, два режима рендеринга, и поисковый робот видит полноценные страницы с метатегами и canonical.
Фишка в деталях: `returnTo` в query-параметре сохраняет контекст фильтров при закрытии модали, но в canonical не попадает. Пользователь возвращается туда, откуда пришёл, а индексируется чистый URL без служебного мусора.
Применимо к любому каталогу: товары, события, объявления, вакансии. Кто сейчас сидит на `useState`-модалках и думает «потом разберёмся» — вот разбор с кодом и рабочим примером.
Разбор с демо-проектом: Habr - SEO