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 ID | Text | Постоянный отклик |
| Опциональный | Haptic ID | Text | Light |
| Опциональный | Haptic | Boolean | true |
У обязательного переключателя нет — и это логично: отключать его не предполагается.
В контракт компонента этот слой не попадает. Он не рисуется и в дерево анатомии не идёт;
вместо него заполняется раздел interaction.
Haptic Map
«Haptic Map — это сводная схема всех жестовых событий, на которые система даёт тактильный отклик. Карта помогает согласовать работу UI-компонентов, анимаций и вибрации на разных платформах.»
Карта разложена на две части: триггеры — события, на которые можно повесить отклик, и отклики — сами вибрации.
Триггеры
onTapStart | onMouseDown / onTouchStart | onTapDown | Начало нажатия, палец коснулся экрана |
onTapEnd | onMouseUp / onTouchEnd | onTapUp | Палец поднят |
onTap | onClick | onTap | Успешный клик — нажатие завершилось верно |
onTapCancel | onPointerCancel | onTapCancel | Отмена жеста: палец увели, не отпуская |
onLongPressMove | onPointerDown + onPointerMove | onLongPressMoveUpdate | Удержание с движением |
onPanStart | onPointerDown | onPanStart | Начало движения или свайпа |
onPointerUp | onPointerUp | onPanEnd | Окончание движения или свайпа |
onOverscroll | onScroll + проверка | OverscrollNotification | Достижение края прокрутки |
onRefresh | onRefresh | RefreshIndicator.onRefresh | Тяга вниз для обновления |
onDragStart | onDragStart | onReorderStart | Начало перетаскивания |
OnDragEnd | onDragEnd | onReorderEnd | Окончание перетаскивания |
OnFlip | onFlip | onFlip | Переворот |
Отклики: удар
Базовые значения, ни к какому сценарию не привязанные.
| Light — лёгкий удар | hp_impact_light | json | native | ahap |
| Medium — средний удар | hp_impact_medium | json | native | ahap |
| Heavy — сильный удар | hp_impact_heavy | json | native | ahap |
| Soft — мягкий удар | hp_impact_soft | json | json | ahap |
| Rigid — звонкий удар | hp_impact_rigid | json | native | ahap |
| Pressed On — нажатие | hp_impact_pressed_on | json | json | ahap |
| Pressed Off — отжатие | hp_impact_pressed_off | json | json | ahap |
Отклики: уведомление
| Success — подтверждение | hp_notification_success | json | native | ahap |
| Warning — предупреждение | hp_notification_warning | json | native | ahap |
| Error — ошибка | hp_notification_error | json | native | ahap |
Отклики: органы управления
| Radio On | hp_control_radio_on | json | native | ahap |
| Radio Off | hp_control_radio_off | json | native | ahap |
| Checkbox On | hp_control_checkbox_on | json | json | ahap |
| Checkbox Off | hp_control_checkbox_off | json | json | ahap |
| Switch On | hp_control_switch_on | json | native | ahap |
| Switch Off | hp_control_switch_off | json | native | ahap |
Отклики: компонентные
| Preloader — загрузчик | hp_component_preloader | json | json | ahap |
| Slide In — переворот вниз | hp_widget_slide_af_in | json | json | ahap |
| Slide Out — переворот вверх | hp_widget_slide_af_out | json | json | ahap |
Столбцы платформ говорят, чем отклик задан: 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 контрактов базы виброотклик записан у трёх, и во всех метка одна — опциональная, проброшенная наружу:
action | 16 из 60 | hp_impact_light | выключен |
icon-button | 54 из 270 | hp_impact_light | выключен |
button | 37 из 273 | hp_impact_light | выключен |
button | 27 из 273 | hp_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.