Haptic

Источник: ds-docs/component-contracts/foundations/haptic.md

Источник смысла: раздел Figma «Haptic» 82835:6132, прочитан 20.08.2026. Источник состава: компоненты-метки в файле, сверены 04.09.2026. Только факты. Находки — в конце.

Тактильный отклик — короткая вибрация в ответ на действие пользователя. В Astra DS он задан не «на глаз», а тремя вещами: событием, на которое срабатывает, идентификатором отклика и признаком, обязателен он или нет.

Переменных у виброотклика нет. Это единственный фундамент без токенов: отклик живёт компонентом-меткой внутри мастера и таблицей соответствий в разделе Figma. В коде ему отвечает не переменная, а идентификатор вида hp_impact_light.

Как отклик попадает в компонент

Внутри мастера лежит слой размером 0,001 × 0,001 пикселя с барабаном в имени. Он ничего не рисует и на раскладку не влияет — это метка для разработчика.

🥁 Виброотклик / Обязательный40005203:11789Отклик — часть поведения компонента, отключать нельзя
🥁 Виброотклик / Опциональный40005185:9625Отклик желателен, но продукт вправе его не включать

Свойства у них разные:

ОбязательныйHaptic IDTextПостоянный отклик
ОпциональныйHaptic IDTextLight
ОпциональныйHapticBooleantrue

У обязательного переключателя нет — и это логично: отключать его не предполагается.

В контракт компонента этот слой не попадает. Он не рисуется и в дерево анатомии не идёт; вместо него заполняется раздел interaction.

Haptic Map

«Haptic Map — это сводная схема всех жестовых событий, на которые система даёт тактильный отклик. Карта помогает согласовать работу UI-компонентов, анимаций и вибрации на разных платформах.»

Карта разложена на две части: триггеры — события, на которые можно повесить отклик, и отклики — сами вибрации.

Триггеры

onTapStartonMouseDown / onTouchStartonTapDownНачало нажатия, палец коснулся экрана
onTapEndonMouseUp / onTouchEndonTapUpПалец поднят
onTaponClickonTapУспешный клик — нажатие завершилось верно
onTapCancelonPointerCancelonTapCancelОтмена жеста: палец увели, не отпуская
onLongPressMoveonPointerDown + onPointerMoveonLongPressMoveUpdateУдержание с движением
onPanStartonPointerDownonPanStartНачало движения или свайпа
onPointerUponPointerUponPanEndОкончание движения или свайпа
onOverscrollonScroll + проверкаOverscrollNotificationДостижение края прокрутки
onRefreshonRefreshRefreshIndicator.onRefreshТяга вниз для обновления
onDragStartonDragStartonReorderStartНачало перетаскивания
OnDragEndonDragEndonReorderEndОкончание перетаскивания
OnFliponFliponFlipПереворот

Отклики: удар

Базовые значения, ни к какому сценарию не привязанные.

Light — лёгкий ударhp_impact_lightjsonnativeahap
Medium — средний ударhp_impact_mediumjsonnativeahap
Heavy — сильный ударhp_impact_heavyjsonnativeahap
Soft — мягкий ударhp_impact_softjsonjsonahap
Rigid — звонкий ударhp_impact_rigidjsonnativeahap
Pressed On — нажатиеhp_impact_pressed_onjsonjsonahap
Pressed Off — отжатиеhp_impact_pressed_offjsonjsonahap

Отклики: уведомление

Success — подтверждениеhp_notification_successjsonnativeahap
Warning — предупреждениеhp_notification_warningjsonnativeahap
Error — ошибкаhp_notification_errorjsonnativeahap

Отклики: органы управления

Radio Onhp_control_radio_onjsonnativeahap
Radio Offhp_control_radio_offjsonnativeahap
Checkbox Onhp_control_checkbox_onjsonjsonahap
Checkbox Offhp_control_checkbox_offjsonjsonahap
Switch Onhp_control_switch_onjsonnativeahap
Switch Offhp_control_switch_offjsonnativeahap

Отклики: компонентные

Preloader — загрузчикhp_component_preloaderjsonjsonahap
Slide In — переворот внизhp_widget_slide_af_injsonjsonahap
Slide Out — переворот вверхhp_widget_slide_af_outjsonjsonahap

Столбцы платформ говорят, чем отклик задан: json — описанием, native — системным откликом платформы, ahap — файлом AHAP для iOS.

Что записывает контракт

Слой виброотклика идёт в раздел interaction. Форма одна:

interaction:
  - {action: tap, trigger: null, haptic: hp_impact_light, enabled: false, exposed: true,
     when: {State: Default}}
  • action — жест: tap, longPress, pan, scroll, refresh, drag, flip;
  • trigger — имя из таблицы триггеров выше либо null;
  • haptic — свойство Haptic ID инстанса; null означает «слой есть, отклик не назван»;
  • enabled — переключатель Haptic; у обязательной метки его нет;
  • exposed — проброшен ли слой в публичные свойства компонента;
  • when — в каких мастерах слой стоит.

Валидатор сверяет триггер и идентификатор с tokens/haptic.json — той же картой, что выше. Незнакомое имя — ошибка; action обязан отвечать семейству триггера.

trigger почти всегда null, и это честно. Слой несёт только идентификатор и переключатель, а карты «событие → компонент» в разделе Haptic нет — значит из макета событие не прочитать. Пишем null и заводим дыру.

Из 27 контрактов базы виброотклик записан у трёх, и во всех метка одна — опциональная, проброшенная наружу:

action16 из 60hp_impact_lightвыключен
icon-button54 из 270hp_impact_lightвыключен
button37 из 273hp_impact_lightвыключен
button27 из 273hp_notification_warningвключён

Находки

  • Два компонента-метки различаются набором свойств. У обязательного только Haptic ID, у опционального ещё и переключатель Haptic. Прежняя версия этого документа утверждала, что свойства у обоих одинаковые, — неверно.
  • У обязательного отклика в поле идентификатора по умолчанию стоит Постоянный отклик. Поле, которое должно нести hp_*, по умолчанию содержит русскую фразу. Пока дизайнер не заменит её, из макета не прочитать, какой именно отклик имеется в виду.
  • Событие в макете не записано нигде. Метка несёт идентификатор и переключатель, и всё. Поэтому trigger в контрактах — null, а у всех трёх заведена дыра. Прежде база писала здесь догадки: press (нет такого триггера в карте) у action и icon-button, onTap у button. Догадки сняты 04.09.2026, форма приведена к одной, и валидатор теперь сверяет триггер и отклик с картой.
  • У action и icon-button отклик выключен. Haptic = false во всех мастерах со слоем. То есть метка стоит, а вибрации по умолчанию нет.
  • Имена триггеров в самой карте непоследовательны: десять начинаются со строчной (onTapStart), два — с прописной (OnDragEnd, OnFlip).
  • Слой не нулевого размера, а 0,001 × 0,001 пикселя. На раскладку это не влияет, но «нулевым» его называть неточно.
  • У button слой стоит не во всех мастерах, и включён он наоборот: в Default выключен с hp_impact_light, в Disabled включён с hp_notification_warning. Записано в gaps контракта.

Чего в разделе нет

Состав раздела перечитан 04.09.2026: «Дизайнеру», «Primitive Haptic Tokens» с таблицами Impact, Notification, Control, Components и Triggers, плюс секция «Магический компонент» с двумя метками. Сводной карты «событие → компонент» там нет. Прежняя версия документа ссылалась на неё как на непрочитанное — на деле её в разделе не существует.

Значит, на какое событие срабатывает отклик конкретной кнопки, дизайн-система пока не фиксирует нигде: ни в метке, ни в разделе. Это вопрос владельцу.

Источник

  • Смысл и карта: Figma MCP, Section «Haptic» 82835:6132, 20.08.2026 — открыть.
  • Состав компонентов-меток: чтение файла 04.09.2026, страница «Haptic».

См. также: motion, state-layer, README.