# Фильтры каталога
## Категориальные фильтры
Каждая группа имеет контейнер:
```html
```
Значения представлены ссылками со следующими атрибутами:
- `href` — готовое следующее состояние; это основной интерфейс;
- `data-filter-id` и `data-filter-name` — группа;
- `data-filter-value-id` — внутренний ID значения;
- `data-filter-value-code` — символьный код URL;
- `data-checked="true|false"` — текущее состояние;
- видимые имя и количество подходящих товаров.
Используйте `href`, потому что сервер может переместить значение между path и повторяемым `filter=...`, а также нормализовать порядок path-сегментов.
## Диапазонные фильтры
Контейнер диапазона публикует:
```html
```
Number inputs дополнительно содержат `data-filter-id` и `data-range-bound="min|max"`. Значения формируются из тех же серверных данных, что и UI, и обновляются после AJAX-навигации.
Алгоритм для запроса «длина 500–1000»:
1. Найдите range-контейнер с `data-filter-name="Длина"`.
2. Прочитайте его ID, допустимые min/max и step.
3. Ограничьте запрос пользователя опубликованными границами и соблюдайте step.
4. Удалите существующий `range` с тем же ID.
5. Добавьте `range={id}_s_o_500-e_d_1000`.
6. Удалите `page`, потому что набор результатов изменился.
7. Откройте URL и проверьте новые `data-range-selected-*`.
Если выбран полный опубликованный диапазон, штатный UI удаляет соответствующий `range` из URL.
## Несколько фильтров
- Разные категориальные группы комбинируются.
- Разные range ID комбинируются повторяемыми `range`.
- Категориальные и range фильтры комбинируются между собой.
- UI предполагает переключение, а не множественный выбор нескольких значений одной категориальной группы.
## Сброс
Активные категориальные значения и группы имеют ссылки сброса. Активный range имеет ссылку, которая удаляет только параметр соответствующего ID. Предпочитайте эти ссылки ручному редактированию сложного path.
## Динамичность
Допустимые значения, количества и границы зависят от выбранной категории и остальных фильтров. Не кэшируйте их как глобальный справочник и не переносите ID между несвязанными страницами без повторной проверки HTML.
В WebMCP сначала вызывайте `get_catalog_filters` без `filterId`: он возвращает до трёх групп, `nextOffset` и выбранные значения. Для раскрытия конкретной группы повторите вызов с её `filterId`; значения также идут страницами до трёх элементов через `nextValueOffset`. Для перехода используйте возвращённый `resultUrl` или типизированные `set_catalog_range`/`set_catalog_sort`.