---
metadata:
  - name: generator
    content: Diplodoc Platform v5.70.0
alternate:
  - https://yandex.ru/support/kit/ru/site-editor/custom-sections/shablons/controllers.md
  - href: https://yandex.ru/support/kit/ru/site-editor/custom-sections/shablons/controllers.md
    type: text/markdown
    title: Markdown version
  - href: https://yandex.ru/support/kit/ru/llms.txt?revision=r22105010
    rel: describedby
---
> **Documentation Index:** Fetch the complete configuration index at https://yandex.ru/support/kit/ru/llms.txt?revision=r22105010



# Контроллеры

Контроллеры — это вспомогательные компоненты, которые отвечают за получение, подготовку и предоставление данных из одного или нескольких источников.

#|
|| [B](#b) | [C](#c) | [D](#d) | [E](#e) | [G](#g) | [F](#f)| [I](#i) | [L](#l) | [M](#m) | [P](#p) | [R](#r) | [S](#s) | [T](#t) | [U](#u) | [V](#v) ||
|#

{#b}

## `<ya-kit-blog-detail-controller />`

Вспомогательный компонент для загрузки статьи и размещения ее в контексте шаблона.

#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isLoading`

|

`boolean`

|

`true` во время загрузки данных, `false` после завершения.

|

Да

||
||

`model`

|

`BlogModel`, `null`

|

Загруженная модель с данными или `null`.

|

Нет

||
|#

{% endcut %}

Связанные модели: [BlogModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#blog).


## `<ya-kit-blog-listing-controller />`

Вспомогательный компонент для загрузки списка статей.


#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
||

**per-page**

|

`number`

|

Количество карточек на странице.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isLoading`

|

`boolean`

|

`true` во время загрузки данных, `false` после завершения.

|

Да

||
||

`model`

|

`BlogListingModelr`

|

Загруженная модель с данными.

|

Нет

||
||

`quantity`

|

`number`

|

Текущее количество товара в корзине пользователя.

|

Да

||
||

`onPageChange`

|

`(page: number) => void`

|

Функция обновления активной страницы.

|

Да

||
|#

{% endcut %}

Связанные модели: [BlogListingModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#blog-listing).

## `<ya-kit-breadcrumbs-controller />`

Вспомогательный компонент для загрузки данных о хлебных крошек и размещения их в контексте шаблона. Компонент автоматически извлекает информацию о хлебных крошках и предоставляет ее дочерним компонентам через контекст.

#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isLoading`

|

`boolean`

|

`true` во время загрузки данных, `false` после завершения.

|

Да

||
||

`model`

|

`BreadcrumbModel[]`

|

Массив загруженных моделей с данными.

|

Нет

||
|#

{% endcut %}

Связанные модели: [BreadcrumbModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#breadcrumb).

## `<ya-kit-boundary-controller />`

Вспомогательный компонент для автоматического отслеживания положения элемента относительно страницы и области просмотра.

#|
|| **Название** | **Тип** | **Описание** ||
|| **as** | `string` | Имя ключа в контексте, под которым будут доступны загруженные данные. ||
|#

{% cut "Структура добавленного объекта" %}

#|
|| **Название** | **Тип** | **Описание** | Обязательное ||
|| `rect` | `Nullable<DOMBoundaryRect>` | Информация о границах отслеживаемого элемента. | Нет ||
|| `center.relative` | `Optional<Point>` | Относительные координаты центра в долях от размеров `viewport`. | Нет ||
|| `center.absolute` | `Optional<Point>` | Абсолютные координаты центра элемента относительно документа. | Нет ||
|| `viewport.width` | `Optional<number>` | Ширина области просмотра браузера. | Нет ||
|| `viewport.height` | `Optional<number>` | Высота области просмотра браузера. | Нет ||
|| `elementRef` | `RefObject<HTMLElement>` | React ref‑ссылка на DOM‑элемент для отслеживания положения. | Да ||
|#

{% endcut %}

{% cut "Пример использования" %}

```handlebars

<ya-kit-boundary-controller as="controller">
    <div ref="{{controller.elementRef}}">
        {{#with controller.center.relative}}
            <div class="img_wrapper {{if (lte y 0.85) 'active'}}">
                <ya-kit-image src="{{settings.images.left}}" class="img img--left" />
                <ya-kit-image src="{{settings.images.right}}" class="img img--right" />
            </div>
        {{/with}}
    </div>
</ya-kit-boundary-controller>

```
{% endcut %}

Связанные модели: [DOMBoundaryRectModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#boundary-rect), [PointModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#point).

{#c}

## `<ya-kit-categories-controller />`

Вспомогательный компонент для загрузки данных о дереве категорий и размещения их в контексте шаблона.

#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
||

**include‑images**

|

`boolean`

|

Включить/исключить из ответа изображения.

||
|#

{% note info %}

Включение в ответ изображений увеличит время загрузки данных.

{% endnote %}

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isLoading`

|

`boolean`

|

`true` во время загрузки данных, `false` после завершения.

|

Да

||
||

`model`

|

`CategoryModel[]`

|

Список загруженных категорий вместе с дочерними.

|

Нет

||
|#

{% endcut %}

Связанные модели:  [CategoryModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#category).

## `<ya-kit-collections-listing-controller />`

Вспомогательный компонент для загрузки данных о коллекциях и размещения их в контексте шаблона.

#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
||

**source**

|

`all`, `collections`, `categories`

|

Источник данных:

* `all` — категории и коллекции.
* `collections` — только коллекции.
* `categories` — только категории.

По умолчанию `all`.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isLoading`

|

`boolean`

|

`true` во время загрузки данных, `false` после завершения.

|

Да

||
||

`model`

|

`CollectionModel[]`

|

Список загруженных коллекций.

|

Нет

||
|#

{% endcut %}

Связанные модели: [CollectionModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#collection).

## `<ya-kit-company-controller />`

Вспомогательный компонент для загрузки данных о компании из настроек и размещения их в контексте шаблона. Компонент автоматически извлекает информацию о компании и предоставляет ее дочерним компонентам через контекст.

#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isLoading`

|

`boolean`

|

`true` во время загрузки данных, `false` после завершения.

|

Да

||
||

`model`

|

`CompanyModel`, `null`

|

Загруженная модель с данными или `null`.

|

Нет

||
|#

{% endcut %}

Связанные модели: [CompanyModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#company).

## `<ya-kit-carousel-controller />`

Вспомогательный компонент для кастомизации логики работы `<ya-kit-carousel />`.

#|
|| **Название** | **Тип** | **Описание** ||
|| **as** | `string` | Имя ключа в контексте, под которым будут доступны загруженные данные. ||
|#

{% cut "Структура добавленного объекта" %}

#|
|| **Название** | **Тип** | **Описание** | **Обязательное** ||
|| `controls.isPrevEnabled` | `boolean` | Признак доступности кнопки перехода к предыдущему слайду. | Да ||
|| `controls.isNextEnabled` | `boolean` | Признак доступности кнопки перехода к следующему слайду. | Да ||
|| `onTrackScroll` | `() => void` | Функция, которая вызывается при прокрутке карусели. | Да ||
|| `onPrevSlide` | `() => void` | Функция перехода на предыдущий слайд. | Да ||
|| `onNextSlide` | `() => void` | Функция перехода на следующий слайд. | Да ||
|#

{% endcut %}

{% cut "Пример использования" %}

```handlebars

<ya-kit-carousel-controller as="controller">
	<ya-kit-button is-disabled={{not controller.controls.isPrevEnabled}} on-press={{controller.onPrevSlide}}>Назад</ya-kit-button>
	<ya-kit-button is-disabled={{not controller.controls.isNextEnabled}} on-press={{controller.onNextSlide}}>Вперед</ya-kit-button>
    <ya-kit-carousel controller={{controller}}>
    	 <!-- … -->
	</ya-kit-carousel>
</ya-kit-carousel-controller>
```
{% endcut %}

Связанные компоненты: [ya-kit-carousel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/shablons/components/layout.md#carousel).

## `<ya-kit-countdown-controller />`

Вспомогательный компонент для обратного отсчета до указанной даты.

#|
|| **Название** | **Тип** | **Описание** ||
|| **as** | `string` | Имя ключа в контексте для доступа к загруженным данным. ||
|| **date** | `string` | Целевая дата окончания отсчета (в формате ISO 8601). ||
|| **on-complete** | `() => void` | Функция вызываемая по окончании времени. ||
|#

{% cut "Структура добавленного объекта" %}

#|
|| **Название** | **Тип** | **Описание** | **Обязательное** ||
|| `isComplete` | `boolean` | Признак завершения отсчета:
`true` — оставшееся время достигает нуля. | Да ||
|| `timeLeft` | `Nullable<TimeLeftModel>` | Оставшееся время до целевой даты, разбитое на составляющие. | Нет ||
|#

{% endcut %}

{% cut "Пример использования" %}

```handlebars

<ya-kit-countdown-controller date="2026-08-08T12:00:00.000Z" as="controller">
    <ya-kit-h-stack gap="500">
        <ya-kit-v-stack gap="25" align-items="center">
            <ya-kit-text size="5xl" weight="bold">{{padStart controller.timeLeft.days 2 0}}</ya-kit-text>
            <ya-kit-text color="secondary">Дней</ya-kit-text>
        </ya-kit-v-stack>
        <ya-kit-v-stack gap="25" align-items="center">
            <ya-kit-text size="5xl" weight="bold">{{padStart controller.timeLeft.hours 2 0}}</ya-kit-text>
            <ya-kit-text color="secondary">Часов</ya-kit-text>
        </ya-kit-v-stack>
        <ya-kit-v-stack gap="25" align-items="center">
            <ya-kit-text size="5xl" weight="bold">{{padStart controller.timeLeft.minutes 2 0}}</ya-kit-text>
            <ya-kit-text color="secondary">Минут</ya-kit-text>
        </ya-kit-v-stack>
        <ya-kit-v-stack gap="25" align-items="center">
            <ya-kit-text size="5xl" weight="bold">{{padStart controller.timeLeft.seconds 2 0}}</ya-kit-text>
            <ya-kit-text color="secondary">Секунд</ya-kit-text>
        </ya-kit-v-stack>
    </ya-kit-h-stack>
</ya-kit-countdown-controller>

```
{% endcut %}

Связанные модели: [TimeLeftModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#time).

{#d}

## `<ya-kit-delivery-options-controller />`

Вспомогательный компонент для загрузки доступных опций доставки.

#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
||

**location**

|

`RegionModel`

|

Текущая локация пользователя

||
||

**product**

|

 `ProductVariantModel`

|

Выбранный вариант продукта

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isLoading`

|

`boolean`

|

`true` во время загрузки данных, `false` после завершения.

|

Да

||
||

`model`

|

`DeliveryOptionModel[]`

|

Загруженная модель с данными.

|

Нет

||
|#

{% endcut %}

Связанные модели: [RegionModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#region), [ProductVariantModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#product-variant), [DeliveryOptionModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#delivery-option).

## `<ya-kit-discount-ladder-controller />`

Вспомогательный компонент для загрузки данных о лестнице скидок и списка участвующих в акции вариантов товаров. Размещает данные в контексте шаблона, управляет пагинацией и сортировкой. Сам компонент ничего не отображает.

#|
|| **Название** | **Тип** | **Описание** ||
|| **as** | `string` | Имя ключа в контексте, под которым будут доступны данные контроллера. По умолчанию — `controller`. ||
|| **per-page** | `number` | Количество вариантов товаров на странице. Положительное целое число.
По умолчанию — `16` (значение также используется, если передано некорректное число). ||
|#

{% cut "Структура добавленного объекта" %}

#|
|| **Название** | **Тип** | **Описание** | **Обязательное** ||
|| `isLoading` | `boolean` | `true` во время загрузки списка товаров или корзины. `false` после завершения. | Да ||
|| `model` | `DiscountLadderModel` | Модель с данными лестницы скидок, списком товаров, количеством товаров акции в корзине, пагинацией и сортировкой. Всегда содержит объект. При отсутствии данных акции `model.discountLadder` равен `undefined`. | Да ||
|| `onPageChange` | `(page: number) => void` | Функция обновления активной страницы. Изменяет параметр `page` в URL, сохраняя остальные параметры. Для первой страницы параметр `page` удаляется. | Да ||
|| `onSortingChange` | `(sorting: string) => void` | Функция обновления сортировки. Принимает `value` одной из опций `model.sorting.options`. Изменяет параметр `sorting` в URL и переключает список на первую страницу. | Да ||
|| `getPageUrl` | `(page: number) => string` | Возвращает ссылку на указанную страницу списка с сохранением остальных параметров URL. Самостоятельно переход не выполняет. Используется в атрибуте `get-page-url` компонента пагинации. | Да ||
|#

{% endcut %}

{% note info %}

Контроллер самостоятельно загружает данные корзины — оборачивать его в `ya-kit-shopping-cart-controller` не требуется. Перед отображением информации об акции проверяйте наличие `model.discountLadder`. Этот контроллер не предназначен для добавления товаров в корзину.

{% endnote %}

{% cut "Пример использования" %}

```handlebars
<ya-kit-discount-ladder-controller as="ladder" per-page="24">
    {{#if ladder.isLoading}}
        <ya-kit-text>Загрузка...</ya-kit-text>
    {{else}}
        {{#if ladder.model.discountLadder}}
            <ya-kit-v-stack gap="300">
                <ya-kit-text size="xl" weight="bold">
                    {{ladder.model.discountLadder.title}}
                </ya-kit-text>
                <ya-kit-text>
                    Товаров по акции в корзине: {{ladder.model.productsQuantity}}
                </ya-kit-text>

                <ya-kit-products-sorting
                    value="{{ladder.model.sorting.value}}"
                    options="{{ladder.model.sorting.options}}"
                    on-change="{{ladder.onSortingChange}}"
                />

                <ya-kit-v-stack gap="200">
                    {{#each ladder.model.items as |product|}}
                        <a href="{{product.url}}">{{product.name}}</a>
                    {{else}}
                        <ya-kit-text>Товары не найдены</ya-kit-text>
                    {{/each}}
                </ya-kit-v-stack>

                <ya-kit-pagination
                    current="{{ladder.model.pagination.current}}"
                    total="{{ladder.model.pagination.total}}"
                    on-page-change="{{ladder.onPageChange}}"
                    get-page-url="{{ladder.getPageUrl}}"
                />
            </ya-kit-v-stack>
        {{/if}}
    {{/if}}
</ya-kit-discount-ladder-controller>
```

{% endcut %}

Связанные модели: [DiscountLadderModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#discount-ladder).

Связанные компоненты: [ya-kit-products-sorting](https://yandex.ru/support/kit/ru/site-editor/custom-sections/shablons/components/data-display.md#products-sorting), [ya-kit-pagination](https://yandex.ru/support/kit/ru/site-editor/custom-sections/shablons/components/navigation.md#pagination).

## `<ya-kit-drag-controller />`

Вспомогательный компонент для реализации функциональности перетаскивания с отслеживанием позиции и прогресса. Поддерживает ограничение движения по осям, вычисление прогресса и работу как с мышью, так и с touch‑событиями.

#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
||

**is‑disabled**

|

`boolean`

|

Отключает возможность перетаскивания.

||
||

**axis**

|

`x`, `y`, `both`

|

Ограничение движения по осям:

 * `x` — только горизонтальное перемещение.
 * `y` — только вертикальное перемещение.
 * `both` — свободное перемещение в обоих направлениях.

 По умолчанию `both`.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`position`

|

`Nullable<Position>`

|

Текущая позиция перетаскиваемого элемента относительно контейнера. До первого перемещения — `null`.

|

Нет

||
||

`progressHorizontal`

|

`Nullable<number>`

|

Прогресс горизонтального перемещения от 0 до 1. До первого перемещения — `null`.

|

Нет

||
||

`progressVertical`

|

`Nullable<number>`

|

Прогресс вертикального перемещения от 0 до 1. До первого перемещения — `null`.

|

Нет

||
||

`isDragging`

|

`boolean`

|

Индикатор, указывающий, активно ли перетаскивание в данный момент.

|

Да

||
||

`elementRef`

|

`RefObject<HTMLElement>`

|

React ref‑ссылка на перетаскиваемый DOM‑элемент для отслеживания позиций.

|

Да

||
||

`containerRef`

|

`RefObject<HTMLElement>`

|

React ref‑ссылка на контейнер, определяющий границы перемещения.

|

Да

||
|#

{% endcut %}

Связанные примеры: [До/После](https://yandex.ru/support/kit/ru/site-editor/custom-sections/example/others/before-after.md#before-after).

{#e}

## `<ya-kit-email-subscription-controller />`

Вспомогательный компонент для управления формой подписки на почтовую рассылку.

#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
||

**enable-agreement**

|

`boolean`

|

Включает/отключает обязательное согласие пользователя.

||
||

**promocode**

|

`PromocodeModel`, `null`

|

Промокод, который будет отправлен при подписке.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isLoading`

|

`boolean`

|

`true` во время загрузки/отправки данных, `false` после завершения.

|

Да

||
||

`model`

|

`EmailSubscriptionModel / null`

|

Загруженная модель с данными или `null`.

|

Да

||
||

`onEmailChange`

|

`(email: string) => void`

|

Обработчик изменения адреса электронной почты.

|

Да

||
||

`onAgreementChange`

|

`(isAgreed: boolean) => void`

|

Обработчик изменения значения признака согласия.

|

Да

||
||

`onSubmit`

|

`() => void`

|

Валидирует и отправляет форму подписки на сервер.

|

Да

||
|#

{% endcut %}

Связанные модели: [PromocodeModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#product-promocode), [EmailSubscriptionModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#EmailSubs).

{#g}

## `<ya-kit-gifts-controller />`

Вспомогательный компонент для загрузки вариантов выбранного подарка и размещения их в контексте шаблона. Используется на экране или во всплывающем окне выбора конкретного варианта подарка.

#|
|| **Название** | **Тип** | **Описание** ||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные. По умолчанию — `controller`.

||
|#

{% cut "Структура добавленного объекта" %}

#|
|| **Название** | **Тип** | **Описание** | **Обязательное** ||
||

`isLoading`

|

`boolean`

|

`true` во время загрузки вариантов подарка, `false` после завершения.

|

Да

||
||

`items`

|

`GiftVariantOption[]`, `null`

|

Список вариантов подарка для выбора или `null`, если варианты еще не загружены.

|

Нет

||
||

`onLoadGifts`

|

`() => void`

|

Загружает варианты активного подарка.

|

Да

||
|#

{% endcut %}

Связанные модели: [GiftVariantOption](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#VariantOption).

## `<ya-kit-gift-slot-controller />` {#gift-slot-controller}

Вспомогательный компонент для отображения слота подарка в шаблоне. Добавляет к слоту обработчик выбора и использует данные о слотах из `giftSlots` контроллера корзины.

#|
|| **Название** | **Тип** | **Описание** ||
||

**slot**

|

`GiftSlot`

|

Слот подарка (один элемент массива `giftSlots` контроллера корзины) — обязательный параметр.

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны данные слота. По умолчанию — `controller`.

||
|#

{% cut "Структура добавленного объекта" %}

#|
|| **Название** | **Тип** | **Описание** | **Обязательное** ||
||

`model`

|

`GiftSlot`

|

Модель слота подарка, включающая следующие поля:

- `giftId`
- `isAvailable`
- `threshold`
- `progress`
- `remainingCartPrice`
- `current`
- `total`

|

Да

||
||

`onSelect`

|

`() => void`

|

Активирует подарок текущего слота (используя `giftId`) и загружает его варианты.

|

Да

||
|#

{% endcut %}

Связанные модели: [GiftSlot](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#giftslot).

## `<ya-kit-gift-snippet-controller />`

Вспомогательный компонент для одного варианта подарка (сниппета). Размещает вариант в контексте шаблона вместе с обработчиками выбора, удаления и смены подарка.

#|
|| **Название** | **Тип** | **Описание** ||
||

**gift**

|

`GiftVariantOption`

|

Вариант подарка. Обязательный параметр.

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны данные варианта. По умолчанию — `controller`.

||
|#

{% cut "Структура добавленного объекта" %}

#|
|| **Название** | **Тип** | **Описание** | **Обязательное** ||
||

`model`

|

`GiftVariantOption`

|

Модель варианта подарка, включающая следующие поля:

- `id`
- `variant`

|

Да

||
||

`onSelect`

|

`() => void`

|

Выбирает данный вариант подарка (используя `id`).

|

Да

||
||

`onDelete`

|

`() => void`

|

Удаляет выбранный подарок из корзины (используя `giftId` варианта).

|

Да

||
||

`updateGift`

|

`() => void`

|

Активирует подарок этого варианта и подгружает его варианты.

|

Да

||
|#

{% endcut %}

Связанные модели: [GiftVariantOption](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#VariantOption).

{#f}

## `<ya-kit-featured-blog-controller />`

Вспомогательный компонент для загрузки статей и размещения их в контексте шаблона. Компонент поддерживает фильтрацию по тегам и ограничение количества загружаемых статей.

#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
||

**tags**

|

`string[]`

|

Массив тегов для фильтрации статей. Если не указано, загружаются статьи без фильтрации.

||
||

**count**

|

`number`

|

Количество статей для загрузки.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isLoading`

|

`boolean`

|

`true` во время загрузки данных, `false` после завершения.

|

Да

||
||

`model`

|

`BlogModel[]`, `null`

|

Загруженная модель с данными или `null`.

|

Нет

||
|#

{% endcut %}

Связанные модели: [BlogModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#blog).


## `<ya-kit-featured-products-controller />`

Вспомогательный компонент для загрузки коллекции товаров из различных источников данных и размещения их в контексте шаблона. Компонент поддерживает загрузку товаров из категорий, коллекций, релевантных товаров и недавно просмотренных товаров.

#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
||

**data-source**

|

`ProductsSource`

|

Объект с информацией об источнике данных товаров

||
||

**count**

|

`number`

|

Количество товаров для загрузки.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isLoading`

|

`boolean`

|

`true` во время загрузки данных, `false` после завершения.

|

Да

||
||

`model`

|

`ProductSnippetModel[]`, `null`

|

Загруженная модель с данными или `null`.

|

Нет

||
|#

{% endcut %}

Связанные модели: [ProductSnippetModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#snippet-model).

## `<ya-kit-favourite-products-controller />`

Вспомогательный компонент для загрузки списка избранных товаров.

#|
|| **Название** | **Тип** | **Описание**

||
||

**as** | `string` | Имя ключа в контексте, под которым будут доступны загруженные данные.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название** | **Тип** | **Описание** | **Обязательное**

||
||

`isLoading` | `boolean` | `true` во время загрузки данных, `false` после завершения. | Да

||
||

`model` | `FavouriteProductsListingModel` | Загруженная модель с данными. | Нет

||
|#

{% endcut %}

Связанные модели: [FavouriteProductsListingModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#FavouriteModel).

## `<ya-kit-field-controller />`

Вспомогательный компонент для управления состоянием и логикой работы полей.

#|
|| **Название** | **Тип** | **Описание** ||
|| **as** | `string` | Имя ключа в контексте, под которым будут доступны загруженные данные. ||
|| **value** | `TValue` | Значение поля. Если указано, поле становится контролируемым (controlled). ||
|| **isDisabled** | `boolean` | Признак, который делает поле неактивным и недоступным для взаимодействия с пользователем. ||
|| **onChange** | `(value: TValue) => void` | Обработчик изменения значения поля. ||
|#

{% cut "Структура добавленного объекта" %}

#|
|| **Название** | **Тип** | **Описание** | **Обязательное** ||
|| `value` | `TValue` | Текущее значение поля. Тип зависит от параметра поля. | Да ||
|| `isDisabled` | `boolean` | Признак недоступности поля. | Да ||
|| `isHovered` | `boolean` | Признак наведения курсора мыши на поле. | Да ||
|| `isFocused` | `boolean` | Признак фокуса на поле (пользователь активировал поле через клик или Tab). | Да ||
|| `isFocusVisible` | `boolean` | Признак видимости фокуса (активируется при навигации с клавиатуры). | Да ||
|| `setValue` | `(value: TValue) => void` | Метод установки нового значения поля. | Да ||
|| `onMouseEnter` | `(event: Event) => void` | Обработчик события наведения курсора. | Да ||
|| `onMouseLeave` | `(event: Event) => void` | Обработчик события ухода курсора с поля. | Да ||
|| `onFocus` | `(event: Event) => void` | Обработчик получения фокуса полем. | Да ||
|| `onBlur` | `(event: Event) => void` | Обработчик потери фокуса полем. | Да ||
|| `onFocusCapture` | `(event: Event) => void` | Обработчик получения фокуса в фазе захвата. | Да ||
|| `onBlurCapture` | `(event: Event) => void` | Обработчик потери фокуса в фазе захвата. | Да ||
|| `onChange` | `(event: Event) => void` | Обработчик изменения значения поля. | Да ||
|#

{% note info "Условия работы интерактивных свойств полей" %}

Интерактивные свойства полей (такие как состояния `isHovered`, `isFocused`, `isFocusVisible`) требуют подключения соответствующих обработчиков событий:

 - `onMouseEnter` / `onMouseLeave` — для отслеживания наведения курсора;

 - `onFocus` / `onBlur` — для управления фокусом;

 - `onFocusCapture` / `onBlurCapture` — для управления захватом фокуса.

Без реализации этих обработчиков указанные признаки интерактивности не обновятся.

{% endnote %}

{% endcut %}

{% cut "Пример использования" %}

```handlebars

<ya-kit-value-controller initial-value="text" as="controller">
    <ya-kit-field-controller value="{{controller.value}}" on-change="{{controller.onChange}}" as="field">
        <input
			type="text"
			class="input {{if field.isFocused 'focused'}}"
			value="{{controller.value}}"
			on-change="{{field.onChange}}"
			on-focus="{{field.onFocus}}"
			on-blur="{{field.onBlur}}"
		/>
    </ya-kit-field-controller>
</ya-kit-value-controller>

```

```handlebars

<ya-kit-value-controller initial-value="{{true}}" as="controller">
    <ya-kit-field-controller value="{{controller.value}}" on-change="{{controller.onChange}}" as="field">
        <label class="custom-checkbox">
            <input type="checkbox" checked="{{field.value}}" on-change="{{field.onChange}}">
            <span class="checkmark"></span>
            Subscribe to newsletter
        </label>
    </ya-kit-field-controller>
</ya-kit-value-controller>

```

{% endcut %}

{#i}

## `<ya-kit-infinite-scroll-controller />` {#infinite}

Вспомогательный контроллер автоматической догрузки списка. Вызывает переданный обработчик, когда элемент-маркер попадает в область отслеживания окна браузера или заданного контейнера. Подходит в том числе для списков, первая порция которых целиком помещается на экране.

#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Необязательное. Имя ключа в контексте, под которым доступны ссылки на маркер и контейнер. По умолчанию `controller`.

||
||

**on-load-more**

|

`() => void`

|

Обязательное. Обработчик загрузки следующей порции данных. Вызывается без аргументов.

||
||

**is-enabled**

|

`boolean`

|

Обязательное. Разрешает автоматическую догрузку. Передавайте `false` во время загрузки, при ошибке и после окончания списка. Состояния определяет контроллер данных.

||
||

**data-length**

|

`number`

|

Обязательное. Количество элементов во всем накопленном списке, а не размер одной страницы. Изменение значения разрешает следующий вызов обработчика и запускает повторную проверку маркера.

||
||

**root-margin**

|

`string`

|

Необязательное. Расстояние предварительной догрузки: одно значение в пикселях, например `300px`. Верхний отступ всегда нулевой.

Справа, снизу и слева используется указанное расстояние. По умолчанию `200px` для окна браузера и `0px` для собственного контейнера. 

Сокращенная запись из нескольких CSS-значений не поддерживается.

||
|#

{% cut "Структура добавленного объекта" %}

#|
|| **Название** | **Тип** | **Описание** | **Обязательное** ||
|| `elementRef` | `(node: HTMLDivElement, null) => void` | Callback ref для элемента-маркера. Передайте в атрибут `ref` у `div` в конце загруженного списка. Задайте размер маркера, например 1 px в высоту. | Да ||
|| `containerRef` | `Dispatch<SetStateAction<HTMLElement, null>>` | Функция, которую нужно передать в `ref` прокручиваемого HTML-контейнера. Поле всегда присутствует в контексте, но подключать его необязательно: без него областью отслеживания служит окно браузера. | Да ||
|#

{% endcut %}

**Поведение догрузки**

После вызова `on-load-more` повторные вызовы блокируются до изменения `data-length`. Переключение `is-enabled` не снимает блокировку. Если после добавления данных маркер остается в области отслеживания и догрузка разрешена, контроллер может повторно вызвать `on-load-more` без дополнительной прокрутки.

Контроллер не хранит список, состояние загрузки или ошибку. После ошибки повторный запрос следует запускать отдельно, например кнопкой контроллера данных. Обязательного родительского контроллера нет: обработчик и условия догрузки передаются атрибутами.

{% cut "Пример использования" %}

В примере предполагается, что контекст уже содержит `list`: `loadNextPage` — обработчик загрузки, `items` — накопленный массив, `canLoadMore` — признак наличия следующей страницы при отсутствии загрузки и ошибки. Это условные имена данных примера, а не поля, которые создает контроллер.

```handlebars
<ya-kit-infinite-scroll-controller
    as="loader"
    on-load-more="{{list.loadNextPage}}"
    is-enabled="{{list.canLoadMore}}"
    data-length="{{list.items.length}}"
>
    <ya-kit-each of="{{list.items}}" as="item">
        <div>{{item.title}}</div>
    </ya-kit-each>
    <div ref="{{loader.elementRef}}" style="height: 1px;"></div>
</ya-kit-infinite-scroll-controller>
```

Для прокрутки внутри собственного контейнера оберните список и маркер в элемент с ограниченной высотой и передайте ему `containerRef`:

```handlebars
<ya-kit-infinite-scroll-controller
    as="loader"
    on-load-more="{{list.loadNextPage}}"
    is-enabled="{{list.canLoadMore}}"
    data-length="{{list.items.length}}"
    root-margin="300px"
>
    <div ref="{{loader.containerRef}}" style="max-height: 400px; overflow: auto;">
        <ya-kit-each of="{{list.items}}" as="item">
            <div>{{item.title}}</div>
        </ya-kit-each>
        <div ref="{{loader.elementRef}}" style="height: 1px;"></div>
    </div>
</ya-kit-infinite-scroll-controller>
```

{% endcut %}

## `<ya-kit-intersection-controller />`

Вспомогательный компонент для отслеживания пересечения элемента с viewport или родительским контейнером с использованием Intersection Observer API. Предоставляет детальную информацию о видимости элемента и его позиции в области просмотра.

#|
|| **Название** | **Тип**| **Описание** ||
|| **as**| `string` | Имя ключа в контексте, под которым будут доступны загруженные данные. ||
|| **threshold** | `number `| Пороговое значение площади элемента — минимальный размер, при котором элемент считается видимым.
По умолчанию — `0.05`. ||
|| **threshold-step** | `number` | Интервал между значениями в массиве threshold — определяет частоту срабатывания callback IntersectionObserver при изменении видимости элемента.
По умолчанию — `0.2`. ||
|| **root-margin** | `string` | CSS‑подобное свойство — задает расширение или сужение области отслеживания на указанное расстояние.
По умолчанию — `0`. ||
|| **trigger-once** | `boolean` | Признак видимости элемента — указывает, находится ли элемент в области видимости в данный момент. ||
|#

{% cut "Структура добавленного объекта" %}

#|
|| **Название** | **Тип** | **Описание** | **Обязательное** ||
|| `isIntersecting` | `boolean` | Признак, указывающий, находится ли элемент в области видимости в данный момент. | Да ||
|| `intersectionRatio` | `number` | Доля видимой части элемента — от 0 до 1. Точность зависит от настройки `threshold-step`. | Да ||
|| `status` | `string` | Текущий статус пересечения элемента:

`entering` — элемент начинает появляться;
`entered` — элемент полностью появился;
`exited` — элемент полностью скрыт. | Да ||
|| `elementRef` | `RefObject<HTMLElement>` | React ref‑ссылка на отслеживаемый элемент. | Да ||
|| `containerRef` | `RefObject<HTMLElement>` | React ref‑ссылка на контейнер для отслеживания. Если не установлен, используется viewport браузера. | Да
||
|#

{% endcut %}

{#l}

## `<ya-kit-location-controller />`

Вспомогательный компонент для загрузки и выбора текущего региона пользователя.


#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isLoading`

|

`boolean`

|

`true` во время загрузки данных, `false` после завершения.

|

Да

||
||

`model`

|

`RegionModel`, `null`

|

Загруженная модель с данными или `null`.

|

Нет

||
||

`onLocationSelect`

|

`() => void`

|

Функция для выбора новой локации пользователя.

|

Да

||
|#

{% endcut %}

Связанные модели: [RegionModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#region).

{#m}

## `<ya-kit-menu-controller />`

Вспомогательный компонент для загрузки модели меню и размещения их в контексте шаблона. Компонент автоматически извлекает данные меню по указанным идентификаторам и предоставляет их дочерним компонентам через контекст.

#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
||

**menu**

|

`MenuId`, `MenuId[]`

|

Идентификатор меню или массив идентификаторов для загрузки.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isLoading`

|

`boolean`

|

`true` во время загрузки данных, `false` после завершения.

|

Да

||
||

`model`

|

`MenuModel`, `MenuModel[]`, `null`

|

Загруженная модель с данными или `null`:

- Для одного `MenuId` — один объект [`MenuModel`](../../models/menu).
- Для массива `MenuId[]` — массив объектов [`MenuModel`](../../models/menu/)`[]` в порядке переданных идентификаторов.

|

Нет

||
|#

{% endcut %}

{% cut "Пример использования" %}

```handlebars
<ya-kit-menu-controller menu="{{settings.menu}}" as="controller">
    {{#if controller.model}}
        <ya-kit-text size="xl">{{controller.model.title}}</ya-kit-text>
        <div class="menu__items">
            {{#each controller.model.items as |item|}}
                <ya-kit-link to="{{item.url}}">{{item.title}}</ya-kit-link>
            {{/each}}
        </div>
    {{/if}}
</ya-kit-menu-controller>
```

Данный пример загрузит и выведет первый уровень меню.

{% endcut %}

Связанные модели: [MenuModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#menu), [MenuItemModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#menu-item).

## `<ya-kit-metrika-controller />`

Вспомогательный компонент для отправки событий с параметрами в Метрику методом `reachGoal`.

#|
||
**Название** | **Тип** | **Описание** ||
||
**as** | `string` | Имя ключа в контексте, под которым будут доступны загруженные данные. ||
||
**goal** | `string` | Название события. ||
||
**strategy** | `viewport`, `mount`, `manual` | Стратегия отправки события:

* `viewport` — при появлении в зоне видимости.
* `mount` — при монтировании компонента на клиенте (в `useIdleEffect`).
* `manual` — вручную, вызывая метод `onReachGoal` из контекста.

По умолчанию `viewport`.
||
||
**…params** | `Record<string, unknown>` | Параметры события — любые кастомные поля, которые могут быть полезны для детализации события. ||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`onReachGoal`

|

`(overrideParams?: Record<string, unknown>) => void`

|

Функция для отправки события с параметрами, переданными компоненту.
Опциональный параметр `overrideParams` позволяет при вызове дополнить или перезаписать отправляемые параметры.

|

Да

||
|#

{% endcut %}

{#p}

## `<ya-kit-product-detail-controller />`

Вспомогательный компонент для загрузки карточки товара и размещения их в контексте шаблона.

#|
|| **Название** | **Тип** | **Описание** ||
|| **as** | `string` | Имя ключа в контексте, под которым будут доступны загруженные данные. ||
|#

{% cut "Структура добавленного объекта" %}

#|
|| **Название** | **Тип** | **Описание** | **Обязательное** ||
|| `isLoading` | `boolean` | `true` во время загрузки данных, `false` после завершения. | Да ||
|| `model` | `ProductDetailModel`, `null` | Загруженная модель с данными или `null`. | Нет ||
|| `onVariantSelect` | `(id: string, value: string) => void` | Функция выбора нового варианта товара. | Да ||
|| `onAddVariantToCart` | `() => void` | Функция добавления текущего варианта товара в корзину. | Да ||
|| `onUpdateVariantQuantity` | `(quantity: number) => void` | Функция изменения количества текущего варианта товара в корзине. | Да ||
|| `onRemoveVariantFromCart` | `() => void` | Функция удаления текущего варианта товара из корзины. | Да ||
|#

{% endcut %}

Связанные модели: [ProductDetailModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#product-detail).


## `<ya-kit-products-listing-controller />` {#listing-controller}

Вспомогательный компонент для загрузки списка товаров.

#|
|| **Название** | **Тип** | **Описание** ||
|| **as** | `string` | Имя ключа в контексте, под которым будут доступны загруженные данные. ||
|| **per-page** | `number` | Количество карточек на странице. ||
|| **on-filters-did-changed** | `() => void` | Функция вызываемая при обновлении фильтров. ||
|#

{% cut "Структура добавленного объекта" %}

#|
|| **Название** | **Тип** | **Описание** | **Обязательное** ||
|| `isLoading` | `boolean` | `true` во время загрузки данных, `false` после завершения. | Да ||
|| `model` | `ProductsListingModel` | Загруженная модель с данными. | Нет ||
|| `quantity` | `number` | Текущее количество товара в корзине пользователя. | Да ||
|| `onPageChange` | `(page: number) => void` | Функция обновления активной страницы. | Да ||
|| `onFiltersChange` | `() => void` | Функция обновления выставленных фильтров. | Да ||
|#

{% endcut %}

Связанные модели: [ProductsListingModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#products-listing).

## `<ya-kit-product-feedback-listing-controller />` {#feedback-listing-controller}

Контроллер списка отзывов о текущем варианте товара. Загружает отзывы постранично, управляет сортировкой и фильтром через URL и открывает отзыв или медиаленту в просмотрщике.

#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны данные контроллера. По умолчанию: `controller`.

||
||

**per-page**

|

`number`, `string`

|

Необязательное. 

Размер порции отзывов: положительное целое число или его строковая запись, например, `10` или `"10"`. 

Если вы задали корректное значение, загрузка начнется с первой страницы без использования готового превью отзывов карточки товара. Следующие страницы загрузятся с размером порции из ответа API. Если атрибут не передан или значение некорректно, сохраняется стандартная логика, в том числе использование превью при наличии. Изменение размера порции сбрасывает состояние контроллера.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`items`

|

`FeedbackModel[]`

|

Загруженные отзывы. До завершения первой загрузки содержит пустой массив.

|

Да

||
||

`totalCount`

|

`number`

|

Общее количество отзывов в текущей выборке.

|

Да

||
||

`currentIndex`

|

`number`

|

Индекс активной карточки в списке отзывов.

|

Да

||
||

`meta`

|

`FeedbackShortMetaModel`, `null`

|

Сводная информация об отзывах. Равна `null`, если данные недоступны.

|

Да

||
||

`filters`

|

`FeedbackFilterModel[]`

|

Доступные фильтры отзывов.

|

Да

||
||

`sorting`

|

`'NEWEST'`, `'BEST'`, `'WORST'`

|

Текущая сортировка из параметра `sort` URL. По умолчанию `NEWEST`.

|

Да

||
||

`filter`

|

`string` \| `null`

|

Slug активного фильтра из URL. Равен `null`, если фильтр не выбран.

|

Да

||
||

`isLoading`

|

`boolean`

|

Признак первой загрузки, смены условий или загрузки следующей страницы.

|

Да

||
||

`hasMore`

|

`boolean`

|

Показывает, есть ли еще незагруженные отзывы.

|

Да

||
||

`hasError`

|

`boolean`

|

Показывает, завершился ли последний запрос ошибкой. Уже загруженные отзывы сохраняются.

|

Да

||
||

`loadNextPage`

|

`() => void`

|

Функция загрузки следующей страницы или повторного выполнения запроса после ошибки.

|

Да

||
||

`onIndexChange`

|

`(index: number) => void`

|

Функция изменения активной карточки. Заранее загружает следующую страницу при приближении к концу списка.

|

Да

||
||

`onSortingChange`

|

`(value: 'NEWEST', 'BEST', 'WORST') => void`

|

Функция изменения сортировки и синхронизации параметра `sort` URL.

|

Да

||
||

`onFilterChange`

|

`(value: string, null) => void`

|

Функция изменения фильтра и синхронизации параметра `filter` URL.

|

Да

||
||

`onOpenFeedback`

|

`(feedback: FeedbackModel) => void`

|

Функция открытия переданного отзыва в просмотрщике.

|

Да

||
||

`onOpenMedia`

|

`(item: FeedbackMediaItemModel, null) => void`

|

Функция открытия выбранного медиа или общей медиаленты, если передан `null`.

|

Да

||
|#

{% endcut %}

{% cut "Пример использования" %}

```handlebars
<ya-kit-product-feedback-listing-controller as="feedbacks" per-page="10">
    {{#if feedbacks.isLoading}}
        <ya-kit-skeleton height="240" />
    {{else}}
        {{#each feedbacks.items as |feedback|}}
            <ya-kit-product-feedback-card feedback={{feedback}} />
        {{/each}}
    {{/if}}
</ya-kit-product-feedback-listing-controller>
```

{% endcut %}

**Связанные модели**

* [FeedbackModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#feedback-model)
* [FeedbackMediaItemModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#feedback-media-item-model)
* [FeedbackShortMetaModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#feedback-short-meta-model)
* [FeedbackFilterModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#filter-model)

**Связанные компоненты**

* [ya-kit-product-feedback-card](https://yandex.ru/support/kit/ru/site-editor/custom-sections/shablons/components/media.md#product-feedback-card)

##  `<ya-kit-product-feedback-media-list-controller />` {#product-feedback-media}

Контроллер общей медиаленты отзывов текущего варианта товара. Запускает первую загрузку при монтировании и предоставляет данные для построения собственной галереи.

#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны данные контроллера. По умолчанию `controller`.

||
|#

{% note warning %}

Контроллер должен находиться внутри [ya-kit-product-feedback-listing-controller](#feedback-listing-controller).

{% endnote %}

{% cut "Структура добавленного объекта" %}

#|
|| **Название** | **Тип** | **Описание** | **Обязательное** ||
|| `items` | `FeedbackMediaItemModel[]` | Загруженные медиа из отзывов. До завершения первой загрузки содержит пустой массив. | Да ||
|| `totalCount` | `number` | Общее количество медиа в отзывах. | Да ||
|| `isLoading` | `boolean` | Признак первой загрузки или загрузки следующей страницы. | Да ||
|| `hasMore` | `boolean` | Показывает, есть ли еще незагруженные медиа. | Да ||
|| `hasError` | `boolean` | Последний запрос завершился ошибкой. | Да ||
|| `loadNextPage` | `() => void` | Загружает следующую страницу или повторяет запрос после ошибки. | Да ||
|#

{% endcut %}

{% cut "Пример использования" %}

```handlebars
<ya-kit-product-feedback-listing-controller>
    <ya-kit-product-feedback-media-list-controller as="mediaList">
        {{#each mediaList.items as |item|}}
            <ya-kit-product-feedback-media-tile media={{item.media}} />
        {{/each}}
    </ya-kit-product-feedback-media-list-controller>
</ya-kit-product-feedback-listing-controller>
```

{% endcut %}

**Связанные модели**:

* [FeedbackMediaItemModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#feedback-media-item-model)

**Связанные контроллеры**:

* [ya-kit-product-feedback-listing-controller](#feedback-listing-controller)

**Связанные компоненты**:

* [ya-kit-product-feedback-media-tile](https://yandex.ru/support/kit/ru/site-editor/custom-sections/shablons/components/media.md#product-feedback-media-tile)

## `<ya-kit-product-feedback-viewer-controller />` {#feedback-viewer}

Контроллер просмотрщика отзывов и медиа. Предоставляет состояние открытого drawer, выбранный отзыв, медиаленту и обработчиков навигации.

#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны данные контроллера. По умолчанию `controller`.

||
|#

{% note warning %}

Контроллер должен находиться внутри [ya-kit-product-feedback-listing-controller](#feedback-listing-controller).

{% endnote %}

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isOpen`

|

`boolean`

|

Открыт ли просмотрщик отзывов.

|

Да

||
||

`model`

|

`FeedbackModel` \| `null`

|

Отзыв, связанный с текущим экраном. Равен `null`, если просмотрщик закрыт или отзыв для выбранного медиа не найден.

|

Да

||
||

`items`

|

`FeedbackMediaItemModel[]`

|

Медиа текущего отзыва или общей медиаленты. При закрытом просмотрщике содержит пустой массив.

|

Да

||
||

`currentIndex`

|

`number`

|

Индекс выбранного медиа.

|

Да

||
||

`isLoading`

|

`boolean`

|

Загружается ли общая медиалента.

|

Да

||
||

`hasError`

|

`boolean`

|

Завершилась ли загрузка общей медиаленты ошибкой.

|

Да

||
||

`onIndexChange`

|

`(index: number) => void`

|

Выбирает медиа по индексу.

|

Да

||
||

`onRetry`

|

`() => void`

|

Повторяет загрузку медиаленты после ошибки.

|

Да

||
||

`onClose`

|

`() => void`

|

Закрывает просмотрщик и синхронизирует историю браузера.

|

Да

||
|#

{% endcut %}

{% cut "Пример использования" %}

```handlebars
<ya-kit-product-feedback-listing-controller>
    <ya-kit-product-feedback-viewer-controller as='viewer'>
        {{#if viewer.isOpen}}
            <ya-kit-text>Медиа {{add viewer.currentIndex 1}} из {{length viewer.items}}</ya-kit-text>
        {{/if}}
    </ya-kit-product-feedback-viewer-controller>
</ya-kit-product-feedback-listing-controller>
```

{% endcut %}

Связанные модели: 

* [FeedbackModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#feedback-model)
* [FeedbackMediaItemModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#feedback-media-item-model)

Связанные контроллеры: 

* [ya-kit-product-feedback-listing-controller](#feedback-listing-controller)

##  `<ya-kit-product-snippet-controller />` {#snippet-controller}

Вспомогательный компонент для работы с отдельными сниппетами товаров.


#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
||

**product**

|

`ProductVariantModel`

|

Массив тегов для фильтрации статей. Если не указано, загружаются статьи без фильтрации.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isLoading`

|

`boolean`

|

`true` во время загрузки данных, `false` после завершения.

|

Да

||
||

`model`

|

`ProductVariantModel`

|

Загруженная модель с данными.

|

Нет

||
||

#### `quantity`

|

`number`

|

Текущее количество товара в корзине пользователя.

|

Да

||
||

#### `onUpdateQuantity`

|

`(quantity: number) => void`

|

Функция обновления количества товара в корзине.

|

Да

||
||

#### `onRemoveFromCart`

|

`() => void`

|

Функция удаления товара из корзины.

|

Да

||
||

#### `onAddToCart`

|

`() => void`

|

Функция добавления товара в корзину.

|

Да

||
||

#### `onToggleFavourite`

|

`() => void`

|

Функция добавления/удаления товара в избранном.

|

Да

||
|#

{% endcut %}

Связанные модели: [ProductVariantModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#product-variant).


## `<ya-kit-promocode-controller />` {#promocode-controller}

Вспомогательный компонент для загрузки данных о промокоде и размещения их в контексте шаблона.

#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
||

**promocode‑id**

|

`string`

|

Идентификатор промокода для загрузки.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isLoading`

|

`boolean`

|

`true` во время загрузки данных, `false` после завершения.

|

Да

||
||

`model`

|

`PromocodeModel / null`

|

Загруженная модель с данными или `null`.

|

Нет

||
|#

{% endcut %}

Связанные модели:  [PromocodeModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#product-promocode).

## `<ya-kit-products-filters-controller />`

Вспомогательный компонент для управления состоянием и логикой работы формы фильтров продуктов.

#|
|| **Название** | **Тип** | **Описание** ||
|| **as** | `string` | Имя ключа в контексте, под которым будут доступны загруженные данные. ||
|| **schema** | `ProductFiltersModel` | Модель фильтров, определяющая структуру. ||
|| **initial-value** | `Dictionary<unknown>` | Объект с текущими примененными фильтрами. ||
|| **on-submit** | `(values: Dictionary<unknown>) => void` | Обработчик отправки формы. ||
|#

{% cut "Структура добавленного объекта" %}

#|
|| **Название** | **Тип** | **Описание** | **Обязательное** ||
|| `fields` | `ProductFilterModel[]` | Массив дескрипторов полей, описывающих структуру и состояние каждого поля фильтра. | Да ||
|| `isDirty` | `boolean` | Признак изменения значений формы относительно начальных. | Да ||
|| `isSubmitting` | `boolean` | Признак состояния отправки формы. | Да ||
|| `onFormReset` | `() => void` | Обработчик сброса формы к начальным значениям. | Да ||
|| `onFormSubmit` | `(values: Dictionary<unknown>) => void` | Обработчик отправки формы, принимает текущие значения формы. | Да ||
|#

{% endcut %}

{% cut "Пример использования" %}

```Handlebars

<ya-kit-products-filters-controller
    as="controller"
    schema="{{listing.model.filters.schema}}"
    initial-value="{{listing.model.filters.values}}"
    on-submit="{{listing.onFiltersChange}}"
>
    <ya-kit-v-stack gap="200" align-items="stretch">
        {{#each controller.fields as |field|}}
            {{#if (eql field.type "RANGE")}}
                <ya-kit-form-control key="{{field.name}}" label="{{field.title}}">
                    <ya-kit-h-stack gap="100">
                        <ya-kit-input placeholder="от" value="{{field.value.min}}" aria-label="{{field.title}}, от" on-change="{{field.onMinChange}}" />
                        <ya-kit-input placeholder="до" value="{{field.value.max}}" aria-label="{{field.title}}, до" on-change="{{field.onMaxChange}}" />
                    </ya-kit-h-stack>
                </ya-kit-form-control>
            {{elseif (eql field.type "MULTIPLE")}}
                <ya-kit-form-control key="{{field.name}}" label="{{field.title}}">
                    <ya-kit-checkbox-group value="{{field.value}}" aria-label="{{field.title}}" on-change="{{field.onChange}}">
                        <ya-kit-v-stack gap="100">
                            {{#each field.options as |option|}}
                                <ya-kit-form-control-label label="{{option.label}}" aria-label="{{option.title}}">
                                    <ya-kit-checkbox value="{{option.value}}" aria-label="{{option.label}}" />
                                </ya-kit-form-control-label>
                            {{/each}}
                        </ya-kit-v-stack>
                    </ya-kit-checkbox-group>
                </ya-kit-form-control>
            {{elseif (eql field.type "SINGLE")}}
                <ya-kit-form-control key="{{field.name}}" label="{{field.title}}">
                    <ya-kit-radio-group value="{{field.value}}" on-change="{{field.onChange}}">
                        <ya-kit-v-stack gap="100">
                            {{#each field.options as |option|}}
                                <ya-kit-form-control-label label="{{option.label}}">
                                    <ya-kit-radio value="{{option.value}}" aria-label="{{option.label}}" />
                                </ya-kit-form-control-label>
                            {{/each}}
                        </ya-kit-v-stack>
                    </ya-kit-radio-group>
                </ya-kit-form-control>
            {{elseif (eql field.type "BOOLEAN")}}
                <ya-kit-form-control-label label="{{field.title}}">
                    <ya-kit-checkbox is-selected="{{field.value}}" aria-label="{{field.title}}" on-change="{{field.onChange}}" />
                </ya-kit-form-control-label>
            {{/if}}
        {{/each}}
        <ya-kit-h-stack gap="200">
            <ya-kit-button color="primary" on-press="{{controller.onFormSubmit}}">Применить</ya-kit-button>
            <ya-kit-button color="neutral" on-press="{{controller.onFormReset}}">Сбросить</ya-kit-button>
        </ya-kit-h-stack>
    </ya-kit-v-stack>
</ya-kit-products-filters-controller>

```

{% endcut %}

Связанные модели: [ProductFilterModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#product-filter).

{#r}

## `<ya-kit-resize-controller />`

Вспомогательный компонент для автоматического отслеживания размеров элемента с использованием ResizeObserver API. Предоставляет информацию о ширине и высоте элемента в реальном времени при изменении его размеров.

#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`size.width`

|

`number`, `null`

|

Ширина отслеживаемого элемента или null до первого измерения.

|

Нет.

||
||

`size.height`

|

`number`, `null`

|

Высота отслеживаемого элемента или null до первого измерения.

|

Нет.

||
|#

{% endcut %}

{#s}

## `<ya-kit-self-pickup-controller />`

Вспомогательный компонент для загрузки доступных точек самовывоза заказа.


#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
||

**location**

|

`RegionModel`

|

Текущая локация пользователя.

||
||

**product**

|

`ProductVariantModel`

|

Выбранный вариант продукта.

||
||

**quantity**

|

`number`

|

Необходимо количество.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isLoading`

|

`boolean`

|

`true` во время загрузки данных, `false` после завершения.

|

Да

||
||

`model`

|

`SelfPickupModel[]`

|

Загруженная модель с данными.

|

Нет

||
|#

{% endcut %}

Связанные модели: [RegionModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#region), [ProductVariantModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#product-variant), [SelfPickupModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#self-pickup).


## `<ya-kit-shopping-cart-controller />` {#cart-controller}

{% note info %}

Кастомные секции пока не поддерживают наборы товаров. Для отображения корзины используется стандартная секция.

{% endnote %}

Вспомогательный компонент для загрузки данных о корзине и размещения их в контексте шаблона. Компонент автоматически извлекает информацию о компании и предоставляет ее дочерним компонентам через контекст.


#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isLoading`

|

`boolean`

|

`true` во время загрузки данных, `false` после завершения.

|

Да

||
||

`model`

|

`ShoppingCartModel`, `null`

|

Загруженная модель с данными корзины или `null`.

|

Нет

||
|#

{% endcut %}

Связанные модели: [ShoppingCartModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#shopping-cart).

## `<ya-kit-shopping-cart-bundle-controller />`

Вспомогательный компонент для одного бандла (набора товаров). Размещает бандл в контексте шаблона вместе с обработчиками изменения количества и удаления из корзины.

#|
|| **Название** | **Тип** | **Описание** ||
||

**bundle**

|

`ShoppingCartBundleModel`

|

Модель бандла — обязательный параметр.

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны данные бандла. По умолчанию — `controller`.

||
|#

{% cut "Структура добавленного объекта" %}

#|
|| **Название** | **Тип** | **Описание** | **Обязательное** ||
||

`model`

|

`CartBundleModel`

|

Модель бандла, включающая следующие поля:

- `bundleId`
- `bundleLink`
- `totalPrice`
- `finalTotalPrice`
- `quantity`
- `maxQuantity`
- `items`

|

Да

||
||

`items`

|

`ShoppingCartBundleItem[]`

|

Список товаров бандла, включающий следующие поля для каждого товара:

- `variant`
- `quantity`
- `price`
- `finalPrice`
- `addons`
- `availableAddons`

|

Да

||
||

`quantity`

|

`number`

|

Текущее количество бандлов в корзине.

|

Да

||
||

`maxQuantity`

|

`number`

|

Максимально доступное количество бандлов.

|

Да

||
||

`onUpdateQuantity`

|

`(quantity: number) => void`

|

Обновляет количество бандлов в корзине. Принимает параметр `quantity` — новое количество бандлов.

|

Да

||
||

`onRemove`

|

`() => void`

|

Удаляет бандл из корзины (устанавливает количество в `0`).

|

Да

||
|#

{% endcut %}

Связанные модели: [ShoppingCartBundleModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#BundleModel), [ShoppingCartBundleItem](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#BundleItem).

{#t}

## `<ya-kit-toggle-controller />`

Вспомогательный компонент управления скрытием/раскрытием.


#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
||

**initial-value**

|

`boolean`

|

Первоначальное состояние при монтировании компонента.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isOpen`

|

`boolean`

|

Текущее состояние компонента.

|

Да

||
||

`onToggle`

|

`() => void`

|

Переключает состояние на противоположное.

|

Да

||
||

`onSetTruthy`

|

`() => void`

|

Устанавливает состояние в `true`.

|

Да

||
||

`onSetFalsy`

|

`() => void`

|

Устанавливает состояние в `false`.

|

Да

||
|#

{% endcut %}

{#u}

## `<ya-kit-user-controller />`

Вспомогательный компонент для загрузки данных о текущем пользователе. Размещает данные в контексте шаблона. Компонент автоматически получает информацию о компании и предоставляет ее дочерним компонентам через контекст.


#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`isLoading`

|

`boolean`

|

`true` во время загрузки данных, `false` после завершения.

|

Да

||
||

`model`

|

`UserModel`, `null`

|

Загруженная модель с данными или `null`.

|

Нет

||
||

`onLogin`

|

`() => void`

|

Функция для аутентификации пользователя в системе.

|

Да

||
||

`onLogout`

|

`() => void`

|

Функция для выхода пользователя из системы.

|

Да

||
||

`onOpenLoginModal`

|

`() => void`

|

Функция для показа модального окна для аутентификации пользователя в системе.

|

Нет

||
|#

{% endcut %}

Связанные модели: [UserModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#user), [RegionModel](https://yandex.ru/support/kit/ru/site-editor/custom-sections/utilities/data.md#region).

{#v}

## `<ya-kit-value-controller />`

Вспомогательный компонент для хранения значений переменных.


#|
||

**Название**

|

**Тип**

|

**Описание**

||
||

**as**

|

`string`

|

Имя ключа в контексте, под которым будут доступны загруженные данные.

||
||

**initial-value**

|

`unknown`

|

Первоначальное значение переменной.
|#

{% cut "Структура добавленного объекта" %}

#|
||

**Название**

|

**Тип**

|

**Описание**

|

**Обязательное**

||
||

`value`

|

`unknown`

|

Текущее значение переменной.

|

Да

||
||

`onChange`

|

`(value: unknown) => void`

|

Выставляет новое значение переменной.

|

Да

||
||

`makeChangeHandler`

|

`(value: unknown) => VoidFunction`

|

Создает обработчик, который будет устанавливать указанное значение.

|

Да

||
|#

{% endcut %}

<!-- source: ru/_includes/support.md -->


## Обратиться в службу поддержки


[Написать в чат](https://yandex.ru/chat/#/user/6c041b05-07a4-99cc-79be-8670b7aff93d){.button}

[Написать письмо](https://yandex.ru/support/kit/ru/feedback.md){.button}

[Яндекс KITᵝ в Telegram](https://t.me/kityandex_support_bot){.button}

[Яндекс KITᵝ в МАКС](https://max.ru/yandex_kit_bot){.button}
<!-- endsource: ru/_includes/support.md -->

