From 3202c80c9abf75be78ff9ef27d507d3ea010527e Mon Sep 17 00:00:00 2001 From: Vadim Kalushko Date: Tue, 12 May 2026 08:36:56 +0300 Subject: [PATCH 01/12] =?UTF-8?q?(feat/shared):=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20WebHaptics=20[DS-16107]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/checkbox/src/Component.tsx | 20 ++++++++++- packages/checkbox/tsconfig.build.json | 4 ++- packages/checkbox/tsconfig.json | 3 ++ packages/config/src/CoreConfigContext.ts | 3 ++ packages/shared/package.json | 3 +- packages/shared/src/haptics.ts | 46 ++++++++++++++++++++++++ packages/shared/src/index.ts | 1 + yarn.lock | 22 ++++++++++++ 8 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 packages/shared/src/haptics.ts diff --git a/packages/checkbox/src/Component.tsx b/packages/checkbox/src/Component.tsx index 5422c03026..569a7d20bd 100644 --- a/packages/checkbox/src/Component.tsx +++ b/packages/checkbox/src/Component.tsx @@ -4,6 +4,7 @@ import React, { forwardRef, type InputHTMLAttributes, type LabelHTMLAttributes, + type PointerEvent, type ReactNode, type Ref, type RefObject, @@ -12,7 +13,8 @@ import React, { import mergeRefs from 'react-merge-refs'; import cn from 'classnames'; -import { dom, getDataTestId } from '@alfalab/core-components-shared'; +import { useCoreConfig } from '@alfalab/core-components-config'; +import { dom, getDataTestId, triggerHaptic } from '@alfalab/core-components-shared'; import { useFocus } from '@alfalab/hooks'; import { CheckIcon } from './icon'; @@ -189,9 +191,23 @@ export const Checkbox = forwardRef( ref, ) => { const labelRef = useRef(null); + const addonsRef = useRef(null); + const { haptics } = useCoreConfig(); const [focused] = useFocus(labelRef, 'keyboard'); + const handlePointerDown = (event: PointerEvent) => { + labelProps?.onPointerDown?.(event); + + const isAddonClick = addonsRef.current?.contains(event.target as Node); + + if (event.defaultPrevented || disabled || isAddonClick) { + return; + } + + triggerHaptic('selection', { enabled: haptics?.enabled }); + }; + const handleChange = (event: ChangeEvent) => { if (onChange) { onChange(event, { checked: event.target.checked, name }); @@ -216,6 +232,7 @@ export const Checkbox = forwardRef( return (