@vkontakte/vkui 7.3.2 → 7.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/components/FormItem/FormItem.d.ts.map +1 -1
  2. package/dist/components/FormItem/FormItem.js +4 -2
  3. package/dist/components/FormItem/FormItem.js.map +1 -1
  4. package/dist/components/FormLayoutGroup/FormLayoutGroup.d.ts +1 -1
  5. package/dist/components/FormLayoutGroup/FormLayoutGroup.d.ts.map +1 -1
  6. package/dist/components/FormLayoutGroup/FormLayoutGroup.js +6 -3
  7. package/dist/components/FormLayoutGroup/FormLayoutGroup.js.map +1 -1
  8. package/dist/components/Search/Search.d.ts +2 -2
  9. package/dist/components/Search/Search.d.ts.map +1 -1
  10. package/dist/components/Search/Search.js.map +1 -1
  11. package/dist/components/Touch/Touch.d.ts.map +1 -1
  12. package/dist/components/Touch/Touch.js +27 -7
  13. package/dist/components/Touch/Touch.js.map +1 -1
  14. package/dist/components.css +1 -1
  15. package/dist/components.css.map +1 -1
  16. package/dist/cssm/components/FormItem/FormItem.js +2 -1
  17. package/dist/cssm/components/FormItem/FormItem.js.map +1 -1
  18. package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.js +3 -1
  19. package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.js.map +1 -1
  20. package/dist/cssm/components/Search/Search.js.map +1 -1
  21. package/dist/cssm/components/Touch/Touch.js +27 -7
  22. package/dist/cssm/components/Touch/Touch.js.map +1 -1
  23. package/dist/cssm/components/WriteBar/WriteBar.module.css +7 -0
  24. package/dist/vkui.css +1 -1
  25. package/dist/vkui.css.map +1 -1
  26. package/package.json +1 -1
  27. package/src/components/FormItem/FormItem.tsx +2 -0
  28. package/src/components/FormLayoutGroup/FormLayoutGroup.tsx +3 -0
  29. package/src/components/Search/Search.tsx +3 -3
  30. package/src/components/Touch/Touch.tsx +70 -52
  31. package/src/components/WriteBar/WriteBar.module.css +7 -0
  32. package/src/components/WriteBar/WriteBar.module.css.d.ts.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"FormItem.d.ts","sourceRoot":"","sources":["../../../src/components/FormItem/FormItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAclE,MAAM,WAAW,aACf,SAAQ,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAC1C,UAAU,CAAC,WAAW,CAAC,EACvB,YAAY,EACZ,cAAc;IAChB;;OAEG;IACH,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IACjC;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;IACvC;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC/B;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG;IAC/C,GAAG,EAAE,OAAO,WAAW,CAAC;IACxB,QAAQ,EAAE,OAAO,gBAAgB,CAAC;IAClC,QAAQ,EAAE,OAAO,gBAAgB,CAAC;CAqFnC,CAAC"}
1
+ {"version":3,"file":"FormItem.d.ts","sourceRoot":"","sources":["../../../src/components/FormItem/FormItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAclE,MAAM,WAAW,aACf,SAAQ,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAC1C,UAAU,CAAC,WAAW,CAAC,EACvB,YAAY,EACZ,cAAc;IAChB;;OAEG;IACH,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IACjC;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;IACvC;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC/B;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG;IAC/C,GAAG,EAAE,OAAO,WAAW,CAAC;IACxB,QAAQ,EAAE,OAAO,gBAAgB,CAAC;IAClC,QAAQ,EAAE,OAAO,gBAAgB,CAAC;CAuFnC,CAAC"}
@@ -26,7 +26,7 @@ const stylesStatus = {
26
26
  /**
27
27
  * @see https://vkcom.github.io/VKUI/#/FormItem
28
28
  */ export const FormItem = (_param)=>{
29
- var { children, top, topId, topMultiline = false, topComponent: topComponentProp, bottom, status = 'default', removable, onRemove, removePlaceholder = 'Удалить', getRootRef, htmlFor, bottomId, noPadding, required = false } = _param, restProps = _object_without_properties(_param, [
29
+ var { children, top, topId, topMultiline = false, topComponent: topComponentProp, bottom, status = 'default', removable, onRemove, removePlaceholder = 'Удалить', getRootRef, htmlFor, bottomId, noPadding, required = false, disabled } = _param, restProps = _object_without_properties(_param, [
30
30
  "children",
31
31
  "top",
32
32
  "topId",
@@ -41,7 +41,8 @@ const stylesStatus = {
41
41
  "htmlFor",
42
42
  "bottomId",
43
43
  "noPadding",
44
- "required"
44
+ "required",
45
+ "disabled"
45
46
  ]);
46
47
  const rootEl = useExternRef(getRootRef);
47
48
  const { sizeY = 'none' } = useAdaptivity();
@@ -86,6 +87,7 @@ const stylesStatus = {
86
87
  removePlaceholder: removePlaceholder,
87
88
  indent: removable === 'indent',
88
89
  noPadding: noPadding,
90
+ disabled: disabled,
89
91
  children: /*#__PURE__*/ _jsx("div", {
90
92
  className: classNames("vkuiFormItem__removable", 'vkuiInternalFormItem__removable'),
91
93
  children: wrappedChildren
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/FormItem/FormItem.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames, hasReactNode, isPrimitiveReactNode } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { defineComponentDisplayNames } from '../../lib/react/defineComponentDisplayNames';\nimport type { HasComponent, HasRootRef } from '../../types';\nimport { Removable, type RemovableProps } from '../Removable/Removable';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { FormItemTop } from './FormItemTop/FormItemTop';\nimport { FormItemTopAside } from './FormItemTop/FormItemTopAside';\nimport { FormItemTopLabel } from './FormItemTop/FormItemTopLabel';\nimport { FormItemContext } from './context';\nimport styles from './FormItem.module.css';\n\nconst sizeYClassNames = {\n none: classNames(styles.sizeYNone, 'vkuiInternalFormItem--sizeY-none'),\n compact: classNames(styles.sizeYCompact, 'vkuiInternalFormItem--sizeY-compact'),\n};\n\nconst stylesStatus = {\n error: classNames(styles.statusError, 'vkuiInternalFormItem--status-error'),\n valid: classNames(styles.statusValid, 'vkuiInternalFormItem--status-valid'),\n};\n\nexport interface FormItemProps\n extends React.AllHTMLAttributes<HTMLElement>,\n HasRootRef<HTMLElement>,\n HasComponent,\n RemovableProps {\n /**\n * Дополнительный элемент, отображаемый над содержимым.\n */\n top?: React.ReactNode;\n /**\n * Передаётся при использовании `top`.\n *\n * `id` для `top`.\n */\n topId?: string;\n /**\n * Многострочный вывод заголовка. По умолчанию текст не переносится при переполнении.\n */\n topMultiline?: boolean;\n /**\n * Позволяет поменять тег используемый для top\n * Если оставить пустым, то тег top будет span.\n * Если оставить пустым и использовать htmlFor, то тег top будет label.\n */\n topComponent?: React.ElementType;\n /**\n * Дополнительный элемент, отображаемый под содержимым.\n */\n bottom?: React.ReactNode;\n /**\n * Передаётся при использовании `bottom`.\n *\n * Должен совпадать с `aria-describedby`, который передаётся в компонент, отвечающий за пользовательский ввод.\n */\n bottomId?: string;\n /**\n * Статус, влияющий на стиль отображения компонента.\n */\n status?: 'default' | 'error' | 'valid';\n /**\n * Дает возможность удалить `FormItem`. Рекомендуется использовать только для `Input` или `Select`.\n *\n * Режим `indent` предназначен для визуального отступа.\n */\n removable?: boolean | 'indent';\n /**\n * Удаляет внешние отступы вокруг компонента.\n * @since 5.8.0\n */\n noPadding?: boolean;\n /**\n * Помечает поле обязательным.\n */\n required?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/FormItem\n */\nexport const FormItem: React.FC<FormItemProps> & {\n Top: typeof FormItemTop;\n TopLabel: typeof FormItemTopLabel;\n TopAside: typeof FormItemTopAside;\n} = ({\n children,\n top,\n topId,\n topMultiline = false,\n topComponent: topComponentProp,\n bottom,\n status = 'default',\n removable,\n onRemove,\n removePlaceholder = 'Удалить',\n getRootRef,\n htmlFor,\n bottomId,\n noPadding,\n required = false,\n ...restProps\n}: FormItemProps) => {\n const rootEl = useExternRef(getRootRef);\n const { sizeY = 'none' } = useAdaptivity();\n\n const wrappedChildren = (\n <React.Fragment>\n {isPrimitiveReactNode(top) ? (\n <FormItemTop>\n <FormItemTopLabel htmlFor={htmlFor} Component={topComponentProp} id={topId}>\n {top}\n </FormItemTopLabel>\n </FormItemTop>\n ) : hasReactNode(top) ? (\n top\n ) : null}\n {children}\n {hasReactNode(bottom) && (\n <Footnote\n className={styles.bottom}\n id={bottomId}\n role={status === 'error' ? 'alert' : undefined}\n >\n {bottom}\n </Footnote>\n )}\n </React.Fragment>\n );\n\n const context = React.useMemo(() => ({ required, topMultiline }), [required, topMultiline]);\n\n return (\n <RootComponent\n {...restProps}\n getRootRef={rootEl}\n baseClassName={classNames(\n styles.host,\n !noPadding && styles.withPadding,\n 'vkuiInternalFormItem',\n status !== 'default' && stylesStatus[status],\n sizeY !== 'regular' && sizeYClassNames[sizeY],\n hasReactNode(top) && classNames(styles.withTop, 'vkuiInternalFormItem--withTop'),\n removable && classNames(styles.withRemovable, 'vkuiInternalFormItem--removable'),\n )}\n >\n <FormItemContext.Provider value={context}>\n {removable ? (\n <Removable\n align=\"start\"\n onRemove={(e) => {\n if (rootEl?.current) {\n onRemove?.(e, rootEl.current);\n }\n }}\n removePlaceholder={removePlaceholder}\n indent={removable === 'indent'}\n noPadding={noPadding}\n >\n <div className={classNames(styles.removable, 'vkuiInternalFormItem__removable')}>\n {wrappedChildren}\n </div>\n </Removable>\n ) : (\n wrappedChildren\n )}\n </FormItemContext.Provider>\n </RootComponent>\n );\n};\n\nFormItem.Top = FormItemTop;\nFormItem.TopLabel = FormItemTopLabel;\nFormItem.TopAside = FormItemTopAside;\n\nif (process.env.NODE_ENV !== 'production') {\n defineComponentDisplayNames(FormItem.Top, 'FormItem.Top');\n defineComponentDisplayNames(FormItem.TopLabel, 'FormItem.TopLabel');\n defineComponentDisplayNames(FormItem.TopAside, 'FormItem.TopAside');\n}\n"],"names":["React","classNames","hasReactNode","isPrimitiveReactNode","useAdaptivity","useExternRef","defineComponentDisplayNames","Removable","RootComponent","Footnote","FormItemTop","FormItemTopAside","FormItemTopLabel","FormItemContext","sizeYClassNames","none","compact","stylesStatus","error","valid","FormItem","children","top","topId","topMultiline","topComponent","topComponentProp","bottom","status","removable","onRemove","removePlaceholder","getRootRef","htmlFor","bottomId","noPadding","required","restProps","rootEl","sizeY","wrappedChildren","Fragment","Component","id","className","role","undefined","context","useMemo","baseClassName","Provider","value","align","e","current","indent","div","Top","TopLabel","TopAside","process","env","NODE_ENV"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/FormItem/FormItem.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames, hasReactNode, isPrimitiveReactNode } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { defineComponentDisplayNames } from '../../lib/react/defineComponentDisplayNames';\nimport type { HasComponent, HasRootRef } from '../../types';\nimport { Removable, type RemovableProps } from '../Removable/Removable';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { FormItemTop } from './FormItemTop/FormItemTop';\nimport { FormItemTopAside } from './FormItemTop/FormItemTopAside';\nimport { FormItemTopLabel } from './FormItemTop/FormItemTopLabel';\nimport { FormItemContext } from './context';\nimport styles from './FormItem.module.css';\n\nconst sizeYClassNames = {\n none: classNames(styles.sizeYNone, 'vkuiInternalFormItem--sizeY-none'),\n compact: classNames(styles.sizeYCompact, 'vkuiInternalFormItem--sizeY-compact'),\n};\n\nconst stylesStatus = {\n error: classNames(styles.statusError, 'vkuiInternalFormItem--status-error'),\n valid: classNames(styles.statusValid, 'vkuiInternalFormItem--status-valid'),\n};\n\nexport interface FormItemProps\n extends React.AllHTMLAttributes<HTMLElement>,\n HasRootRef<HTMLElement>,\n HasComponent,\n RemovableProps {\n /**\n * Дополнительный элемент, отображаемый над содержимым.\n */\n top?: React.ReactNode;\n /**\n * Передаётся при использовании `top`.\n *\n * `id` для `top`.\n */\n topId?: string;\n /**\n * Многострочный вывод заголовка. По умолчанию текст не переносится при переполнении.\n */\n topMultiline?: boolean;\n /**\n * Позволяет поменять тег используемый для top\n * Если оставить пустым, то тег top будет span.\n * Если оставить пустым и использовать htmlFor, то тег top будет label.\n */\n topComponent?: React.ElementType;\n /**\n * Дополнительный элемент, отображаемый под содержимым.\n */\n bottom?: React.ReactNode;\n /**\n * Передаётся при использовании `bottom`.\n *\n * Должен совпадать с `aria-describedby`, который передаётся в компонент, отвечающий за пользовательский ввод.\n */\n bottomId?: string;\n /**\n * Статус, влияющий на стиль отображения компонента.\n */\n status?: 'default' | 'error' | 'valid';\n /**\n * Дает возможность удалить `FormItem`. Рекомендуется использовать только для `Input` или `Select`.\n *\n * Режим `indent` предназначен для визуального отступа.\n */\n removable?: boolean | 'indent';\n /**\n * Удаляет внешние отступы вокруг компонента.\n * @since 5.8.0\n */\n noPadding?: boolean;\n /**\n * Помечает поле обязательным.\n */\n required?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/FormItem\n */\nexport const FormItem: React.FC<FormItemProps> & {\n Top: typeof FormItemTop;\n TopLabel: typeof FormItemTopLabel;\n TopAside: typeof FormItemTopAside;\n} = ({\n children,\n top,\n topId,\n topMultiline = false,\n topComponent: topComponentProp,\n bottom,\n status = 'default',\n removable,\n onRemove,\n removePlaceholder = 'Удалить',\n getRootRef,\n htmlFor,\n bottomId,\n noPadding,\n required = false,\n disabled,\n ...restProps\n}: FormItemProps) => {\n const rootEl = useExternRef(getRootRef);\n const { sizeY = 'none' } = useAdaptivity();\n\n const wrappedChildren = (\n <React.Fragment>\n {isPrimitiveReactNode(top) ? (\n <FormItemTop>\n <FormItemTopLabel htmlFor={htmlFor} Component={topComponentProp} id={topId}>\n {top}\n </FormItemTopLabel>\n </FormItemTop>\n ) : hasReactNode(top) ? (\n top\n ) : null}\n {children}\n {hasReactNode(bottom) && (\n <Footnote\n className={styles.bottom}\n id={bottomId}\n role={status === 'error' ? 'alert' : undefined}\n >\n {bottom}\n </Footnote>\n )}\n </React.Fragment>\n );\n\n const context = React.useMemo(() => ({ required, topMultiline }), [required, topMultiline]);\n\n return (\n <RootComponent\n {...restProps}\n getRootRef={rootEl}\n baseClassName={classNames(\n styles.host,\n !noPadding && styles.withPadding,\n 'vkuiInternalFormItem',\n status !== 'default' && stylesStatus[status],\n sizeY !== 'regular' && sizeYClassNames[sizeY],\n hasReactNode(top) && classNames(styles.withTop, 'vkuiInternalFormItem--withTop'),\n removable && classNames(styles.withRemovable, 'vkuiInternalFormItem--removable'),\n )}\n >\n <FormItemContext.Provider value={context}>\n {removable ? (\n <Removable\n align=\"start\"\n onRemove={(e) => {\n if (rootEl?.current) {\n onRemove?.(e, rootEl.current);\n }\n }}\n removePlaceholder={removePlaceholder}\n indent={removable === 'indent'}\n noPadding={noPadding}\n disabled={disabled}\n >\n <div className={classNames(styles.removable, 'vkuiInternalFormItem__removable')}>\n {wrappedChildren}\n </div>\n </Removable>\n ) : (\n wrappedChildren\n )}\n </FormItemContext.Provider>\n </RootComponent>\n );\n};\n\nFormItem.Top = FormItemTop;\nFormItem.TopLabel = FormItemTopLabel;\nFormItem.TopAside = FormItemTopAside;\n\nif (process.env.NODE_ENV !== 'production') {\n defineComponentDisplayNames(FormItem.Top, 'FormItem.Top');\n defineComponentDisplayNames(FormItem.TopLabel, 'FormItem.TopLabel');\n defineComponentDisplayNames(FormItem.TopAside, 'FormItem.TopAside');\n}\n"],"names":["React","classNames","hasReactNode","isPrimitiveReactNode","useAdaptivity","useExternRef","defineComponentDisplayNames","Removable","RootComponent","Footnote","FormItemTop","FormItemTopAside","FormItemTopLabel","FormItemContext","sizeYClassNames","none","compact","stylesStatus","error","valid","FormItem","children","top","topId","topMultiline","topComponent","topComponentProp","bottom","status","removable","onRemove","removePlaceholder","getRootRef","htmlFor","bottomId","noPadding","required","disabled","restProps","rootEl","sizeY","wrappedChildren","Fragment","Component","id","className","role","undefined","context","useMemo","baseClassName","Provider","value","align","e","current","indent","div","Top","TopLabel","TopAside","process","env","NODE_ENV"],"mappings":"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"}
@@ -20,5 +20,5 @@ export interface FormLayoutGroupProps extends HTMLAttributesWithRootRef<HTMLDivE
20
20
  /**
21
21
  * @see https://vkcom.github.io/VKUI/#/FormLayoutGroup
22
22
  */
23
- export declare const FormLayoutGroup: ({ children, mode, removable, segmented, removePlaceholder, onRemove, getRootRef, ...restProps }: FormLayoutGroupProps) => React.ReactNode;
23
+ export declare const FormLayoutGroup: ({ children, mode, removable, segmented, removePlaceholder, onRemove, getRootRef, disabled, ...restProps }: FormLayoutGroupProps) => React.ReactNode;
24
24
  //# sourceMappingURL=FormLayoutGroup.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormLayoutGroup.d.ts","sourceRoot":"","sources":["../../../src/components/FormLayoutGroup/FormLayoutGroup.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AASxE,MAAM,WAAW,oBACf,SAAQ,yBAAyB,CAAC,cAAc,CAAC,EAC/C,cAAc;IAChB;;OAEG;IACH,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IACjC;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAE/B;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,iGAS7B,oBAAoB,KAAG,KAAK,CAAC,SA0C/B,CAAC"}
1
+ {"version":3,"file":"FormLayoutGroup.d.ts","sourceRoot":"","sources":["../../../src/components/FormLayoutGroup/FormLayoutGroup.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,wBAAwB,CAAC;AASxE,MAAM,WAAW,oBACf,SAAQ,yBAAyB,CAAC,cAAc,CAAC,EAC/C,cAAc;IAChB;;OAEG;IACH,IAAI,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC;IACjC;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAE/B;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,2GAU7B,oBAAoB,KAAG,KAAK,CAAC,SA4C/B,CAAC"}
@@ -16,14 +16,15 @@ const sizeYClassNames = {
16
16
  /**
17
17
  * @see https://vkcom.github.io/VKUI/#/FormLayoutGroup
18
18
  */ export const FormLayoutGroup = (_param)=>{
19
- var { children, mode = 'vertical', removable, segmented, removePlaceholder = 'Удалить', onRemove, getRootRef } = _param, restProps = _object_without_properties(_param, [
19
+ var { children, mode = 'vertical', removable, segmented, removePlaceholder = 'Удалить', onRemove, getRootRef, disabled } = _param, restProps = _object_without_properties(_param, [
20
20
  "children",
21
21
  "mode",
22
22
  "removable",
23
23
  "segmented",
24
24
  "removePlaceholder",
25
25
  "onRemove",
26
- "getRootRef"
26
+ "getRootRef",
27
+ "disabled"
27
28
  ]);
28
29
  const { sizeY = 'none' } = useAdaptivity();
29
30
  const isRemovable = removable && mode === 'horizontal';
@@ -31,7 +32,8 @@ const sizeYClassNames = {
31
32
  return /*#__PURE__*/ _jsx(RootComponent, _object_spread_props(_object_spread({
32
33
  getRootRef: rootEl,
33
34
  Component: "fieldset",
34
- baseClassName: classNames("vkuiFormLayoutGroup__host", sizeY !== 'regular' && sizeYClassNames[sizeY], mode === 'horizontal' && classNames("vkuiFormLayoutGroup__modeHorizontal", 'vkuiInternalFormLayoutGroup--mode-horizontal'), mode === 'vertical' && 'vkuiInternalFormLayoutGroup--mode-vertical', isRemovable && classNames("vkuiFormLayoutGroup__withRemovable", 'vkuiInternalFormLayoutGroup--removable'), segmented && classNames("vkuiFormLayoutGroup__segmented", 'vkuiInternalFormLayoutGroup--segmented'))
35
+ baseClassName: classNames("vkuiFormLayoutGroup__host", sizeY !== 'regular' && sizeYClassNames[sizeY], mode === 'horizontal' && classNames("vkuiFormLayoutGroup__modeHorizontal", 'vkuiInternalFormLayoutGroup--mode-horizontal'), mode === 'vertical' && 'vkuiInternalFormLayoutGroup--mode-vertical', isRemovable && classNames("vkuiFormLayoutGroup__withRemovable", 'vkuiInternalFormLayoutGroup--removable'), segmented && classNames("vkuiFormLayoutGroup__segmented", 'vkuiInternalFormLayoutGroup--segmented')),
36
+ disabled: disabled
35
37
  }, restProps), {
36
38
  children: isRemovable ? /*#__PURE__*/ _jsx(Removable, {
37
39
  className: "vkuiFormLayoutGroup__removable",
@@ -42,6 +44,7 @@ const sizeYClassNames = {
42
44
  onRemove === null || onRemove === void 0 ? void 0 : onRemove(e, rootEl.current);
43
45
  }
44
46
  },
47
+ disabled: disabled,
45
48
  indent: removable === 'indent',
46
49
  children: children
47
50
  }) : /*#__PURE__*/ _jsxs(React.Fragment, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/FormLayoutGroup/FormLayoutGroup.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport { Removable, type RemovableProps } from '../Removable/Removable';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './FormLayoutGroup.module.css';\n\nconst sizeYClassNames = {\n none: classNames(styles.sizeYNone, 'vkuiInternalFormLayoutGroup--sizeY-none'),\n compact: classNames(styles.sizeYCompact, 'vkuiInternalFormLayoutGroup--sizeY-compact'),\n};\n\nexport interface FormLayoutGroupProps\n extends HTMLAttributesWithRootRef<HTMLDivElement>,\n RemovableProps {\n /**\n * Направление отображения элементов формы.\n */\n mode?: 'vertical' | 'horizontal';\n /**\n * Только для режима horizontal. Дает возможность удалить всю группу `FormItem`.\n *\n * Режим `indent` предназначен для визуального отступа.\n */\n removable?: boolean | 'indent';\n\n /**\n * Дает возможность склеить несколько `FormItem`.\n */\n segmented?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/FormLayoutGroup\n */\nexport const FormLayoutGroup = ({\n children,\n mode = 'vertical',\n removable,\n segmented,\n removePlaceholder = 'Удалить',\n onRemove,\n getRootRef,\n ...restProps\n}: FormLayoutGroupProps): React.ReactNode => {\n const { sizeY = 'none' } = useAdaptivity();\n const isRemovable = removable && mode === 'horizontal';\n const rootEl = useExternRef(getRootRef);\n\n return (\n <RootComponent\n getRootRef={rootEl}\n Component=\"fieldset\"\n baseClassName={classNames(\n styles.host,\n sizeY !== 'regular' && sizeYClassNames[sizeY],\n mode === 'horizontal' &&\n classNames(styles.modeHorizontal, 'vkuiInternalFormLayoutGroup--mode-horizontal'),\n mode === 'vertical' && 'vkuiInternalFormLayoutGroup--mode-vertical',\n isRemovable && classNames(styles.withRemovable, 'vkuiInternalFormLayoutGroup--removable'),\n segmented && classNames(styles.segmented, 'vkuiInternalFormLayoutGroup--segmented'),\n )}\n {...restProps}\n >\n {isRemovable ? (\n <Removable\n className={styles.removable}\n align=\"start\"\n removePlaceholder={removePlaceholder}\n onRemove={(e) => {\n if (rootEl?.current) {\n onRemove?.(e, rootEl.current);\n }\n }}\n indent={removable === 'indent'}\n >\n {children}\n </Removable>\n ) : (\n <React.Fragment>\n {children}\n <span className={styles.offset} aria-hidden />\n </React.Fragment>\n )}\n </RootComponent>\n );\n};\n"],"names":["React","classNames","useAdaptivity","useExternRef","Removable","RootComponent","sizeYClassNames","none","compact","FormLayoutGroup","children","mode","removable","segmented","removePlaceholder","onRemove","getRootRef","restProps","sizeY","isRemovable","rootEl","Component","baseClassName","className","align","e","current","indent","Fragment","span","aria-hidden"],"mappings":"AAAA;;;;;AAEA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,aAAa,QAAQ,+BAA4B;AAC1D,SAASC,YAAY,QAAQ,8BAA2B;AAExD,SAASC,SAAS,QAA6B,4BAAyB;AACxE,SAASC,aAAa,QAAQ,oCAAiC;AAG/D,MAAMC,kBAAkB;IACtBC,MAAMN,6CAA6B;IACnCO,SAASP,gDAAgC;AAC3C;AAsBA;;CAEC,GACD,OAAO,MAAMQ,kBAAkB;QAAC,EAC9BC,QAAQ,EACRC,OAAO,UAAU,EACjBC,SAAS,EACTC,SAAS,EACTC,oBAAoB,SAAS,EAC7BC,QAAQ,EACRC,UAAU,EAEW,WADlBC;QAPHP;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;;IAGA,MAAM,EAAEE,QAAQ,MAAM,EAAE,GAAGhB;IAC3B,MAAMiB,cAAcP,aAAaD,SAAS;IAC1C,MAAMS,SAASjB,aAAaa;IAE5B,qBACE,KAACX;QACCW,YAAYI;QACZC,WAAU;QACVC,eAAerB,wCAEbiB,UAAU,aAAaZ,eAAe,CAACY,MAAM,EAC7CP,SAAS,gBACPV,kDAAkC,iDACpCU,SAAS,cAAc,8CACvBQ,eAAelB,iDAAiC,2CAChDY,aAAaZ,6CAA6B;OAExCgB;kBAEHE,4BACC,KAACf;YACCmB,SAAS;YACTC,OAAM;YACNV,mBAAmBA;YACnBC,UAAU,CAACU;gBACT,IAAIL,mBAAAA,6BAAAA,OAAQM,OAAO,EAAE;oBACnBX,qBAAAA,+BAAAA,SAAWU,GAAGL,OAAOM,OAAO;gBAC9B;YACF;YACAC,QAAQf,cAAc;sBAErBF;2BAGH,MAACV,MAAM4B,QAAQ;;gBACZlB;8BACD,KAACmB;oBAAKN,SAAS;oBAAiBO,aAAW;;;;;AAKrD,EAAE"}
1
+ {"version":3,"sources":["../../../src/components/FormLayoutGroup/FormLayoutGroup.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport { Removable, type RemovableProps } from '../Removable/Removable';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './FormLayoutGroup.module.css';\n\nconst sizeYClassNames = {\n none: classNames(styles.sizeYNone, 'vkuiInternalFormLayoutGroup--sizeY-none'),\n compact: classNames(styles.sizeYCompact, 'vkuiInternalFormLayoutGroup--sizeY-compact'),\n};\n\nexport interface FormLayoutGroupProps\n extends HTMLAttributesWithRootRef<HTMLDivElement>,\n RemovableProps {\n /**\n * Направление отображения элементов формы.\n */\n mode?: 'vertical' | 'horizontal';\n /**\n * Только для режима horizontal. Дает возможность удалить всю группу `FormItem`.\n *\n * Режим `indent` предназначен для визуального отступа.\n */\n removable?: boolean | 'indent';\n\n /**\n * Дает возможность склеить несколько `FormItem`.\n */\n segmented?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/FormLayoutGroup\n */\nexport const FormLayoutGroup = ({\n children,\n mode = 'vertical',\n removable,\n segmented,\n removePlaceholder = 'Удалить',\n onRemove,\n getRootRef,\n disabled,\n ...restProps\n}: FormLayoutGroupProps): React.ReactNode => {\n const { sizeY = 'none' } = useAdaptivity();\n const isRemovable = removable && mode === 'horizontal';\n const rootEl = useExternRef(getRootRef);\n\n return (\n <RootComponent\n getRootRef={rootEl}\n Component=\"fieldset\"\n baseClassName={classNames(\n styles.host,\n sizeY !== 'regular' && sizeYClassNames[sizeY],\n mode === 'horizontal' &&\n classNames(styles.modeHorizontal, 'vkuiInternalFormLayoutGroup--mode-horizontal'),\n mode === 'vertical' && 'vkuiInternalFormLayoutGroup--mode-vertical',\n isRemovable && classNames(styles.withRemovable, 'vkuiInternalFormLayoutGroup--removable'),\n segmented && classNames(styles.segmented, 'vkuiInternalFormLayoutGroup--segmented'),\n )}\n disabled={disabled}\n {...restProps}\n >\n {isRemovable ? (\n <Removable\n className={styles.removable}\n align=\"start\"\n removePlaceholder={removePlaceholder}\n onRemove={(e) => {\n if (rootEl?.current) {\n onRemove?.(e, rootEl.current);\n }\n }}\n disabled={disabled}\n indent={removable === 'indent'}\n >\n {children}\n </Removable>\n ) : (\n <React.Fragment>\n {children}\n <span className={styles.offset} aria-hidden />\n </React.Fragment>\n )}\n </RootComponent>\n );\n};\n"],"names":["React","classNames","useAdaptivity","useExternRef","Removable","RootComponent","sizeYClassNames","none","compact","FormLayoutGroup","children","mode","removable","segmented","removePlaceholder","onRemove","getRootRef","disabled","restProps","sizeY","isRemovable","rootEl","Component","baseClassName","className","align","e","current","indent","Fragment","span","aria-hidden"],"mappings":"AAAA;;;;;AAEA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,aAAa,QAAQ,+BAA4B;AAC1D,SAASC,YAAY,QAAQ,8BAA2B;AAExD,SAASC,SAAS,QAA6B,4BAAyB;AACxE,SAASC,aAAa,QAAQ,oCAAiC;AAG/D,MAAMC,kBAAkB;IACtBC,MAAMN,6CAA6B;IACnCO,SAASP,gDAAgC;AAC3C;AAsBA;;CAEC,GACD,OAAO,MAAMQ,kBAAkB;QAAC,EAC9BC,QAAQ,EACRC,OAAO,UAAU,EACjBC,SAAS,EACTC,SAAS,EACTC,oBAAoB,SAAS,EAC7BC,QAAQ,EACRC,UAAU,EACVC,QAAQ,EAEa,WADlBC;QARHR;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;;IAGA,MAAM,EAAEE,QAAQ,MAAM,EAAE,GAAGjB;IAC3B,MAAMkB,cAAcR,aAAaD,SAAS;IAC1C,MAAMU,SAASlB,aAAaa;IAE5B,qBACE,KAACX;QACCW,YAAYK;QACZC,WAAU;QACVC,eAAetB,wCAEbkB,UAAU,aAAab,eAAe,CAACa,MAAM,EAC7CR,SAAS,gBACPV,kDAAkC,iDACpCU,SAAS,cAAc,8CACvBS,eAAenB,iDAAiC,2CAChDY,aAAaZ,6CAA6B;QAE5CgB,UAAUA;OACNC;kBAEHE,4BACC,KAAChB;YACCoB,SAAS;YACTC,OAAM;YACNX,mBAAmBA;YACnBC,UAAU,CAACW;gBACT,IAAIL,mBAAAA,6BAAAA,OAAQM,OAAO,EAAE;oBACnBZ,qBAAAA,+BAAAA,SAAWW,GAAGL,OAAOM,OAAO;gBAC9B;YACF;YACAV,UAAUA;YACVW,QAAQhB,cAAc;sBAErBF;2BAGH,MAACV,MAAM6B,QAAQ;;gBACZnB;8BACD,KAACoB;oBAAKN,SAAS;oBAAiBO,aAAW;;;;;AAKrD,EAAE"}
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
- import type { HasRef, HasRootRef } from '../../types';
2
+ import type { HasDataAttribute, HasRef, HasRootRef } from '../../types';
3
3
  import { type IconButtonProps } from '../IconButton/IconButton';
4
- export type RenderIconButtonFn = (icon: React.ReactNode, props?: Partial<IconButtonProps>) => React.ReactNode;
4
+ export type RenderIconButtonFn = (icon: React.ReactNode, props?: Partial<IconButtonProps> & HasDataAttribute) => React.ReactElement;
5
5
  export interface SearchProps extends React.InputHTMLAttributes<HTMLInputElement>, HasRootRef<HTMLDivElement>, HasRef<HTMLInputElement> {
6
6
  /**
7
7
  * Only iOS. Текст кнопки "отмена", которая чистит текстовое поле и убирает фокус.
@@ -1 +1 @@
1
- {"version":3,"file":"Search.d.ts","sourceRoot":"","sources":["../../../src/components/Search/Search.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAK5E,MAAM,MAAM,kBAAkB,GAAG,CAC/B,IAAI,EAAE,KAAK,CAAC,SAAS,EACrB,KAAK,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,KAC7B,KAAK,CAAC,SAAS,CAAC;AAErB,MAAM,WAAW,WACf,SAAQ,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EACjD,UAAU,CAAC,cAAc,CAAC,EAC1B,MAAM,CAAC,gBAAgB,CAAC;IAC1B;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB;;OAEG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,QAAQ,EAAE,kBAAkB,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7E;;OAEG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACrD;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,iBAAiB,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACzD;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,eAAO,MAAM,MAAM,GAAI,gQAqBpB,WAAW,KAAG,KAAK,CAAC,SAkLtB,CAAC"}
1
+ {"version":3,"file":"Search.d.ts","sourceRoot":"","sources":["../../../src/components/Search/Search.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAa/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAK5E,MAAM,MAAM,kBAAkB,GAAG,CAC/B,IAAI,EAAE,KAAK,CAAC,SAAS,EACrB,KAAK,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,gBAAgB,KAChD,KAAK,CAAC,YAAY,CAAC;AAExB,MAAM,WAAW,WACf,SAAQ,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EACjD,UAAU,CAAC,cAAc,CAAC,EAC1B,MAAM,CAAC,gBAAgB,CAAC;IAC1B;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB;;OAEG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,QAAQ,EAAE,kBAAkB,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7E;;OAEG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACrD;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,iBAAiB,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACzD;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,eAAO,MAAM,MAAM,GAAI,gQAqBpB,WAAW,KAAG,KAAK,CAAC,SAkLtB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/Search/Search.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Icon16Clear, Icon16SearchOutline, Icon24Cancel } from '@vkontakte/icons';\nimport { classNames, hasReactNode, noop } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useAdaptivityConditionalRender } from '../../hooks/useAdaptivityConditionalRender';\nimport { useBooleanState } from '../../hooks/useBooleanState';\nimport { useConfigDirection } from '../../hooks/useConfigDirection';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useNativeFormResetListener } from '../../hooks/useNativeFormResetListener';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { touchEnabled } from '../../lib/touch';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport type { HasRef, HasRootRef } from '../../types';\nimport { Button } from '../Button/Button';\nimport { IconButton, type IconButtonProps } from '../IconButton/IconButton';\nimport { Headline } from '../Typography/Headline/Headline';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport styles from './Search.module.css';\n\nexport type RenderIconButtonFn = (\n icon: React.ReactNode,\n props?: Partial<IconButtonProps>,\n) => React.ReactNode;\n\nexport interface SearchProps\n extends React.InputHTMLAttributes<HTMLInputElement>,\n HasRootRef<HTMLDivElement>,\n HasRef<HTMLInputElement> {\n /**\n * Only iOS. Текст кнопки \"отмена\", которая чистит текстовое поле и убирает фокус.\n */\n after?: React.ReactNode;\n /**\n * Контент, отображаемый перед полем ввода.\n */\n before?: React.ReactNode;\n /**\n * Иконка поиска. Может быть React-элементом или функцией, возвращающей элемент.\n */\n icon?: React.ReactNode | ((renderFn: RenderIconButtonFn) => React.ReactNode);\n /**\n * Обработчик нажатия на иконку поиска.\n */\n onIconClick?: React.PointerEventHandler<HTMLElement>;\n /**\n * Значение поля ввода по умолчанию.\n */\n defaultValue?: string;\n /**\n * Текст для скринридеров, описывающий иконку поиска.\n */\n iconLabel?: string;\n /**\n * Текст для скринридеров, описывающий кнопку очистки.\n */\n clearLabel?: string;\n /**\n * Передает атрибут `data-testid` для кнопки очистки.\n */\n clearButtonTestId?: string;\n /**\n * Удаляет отступы у компонента.\n */\n noPadding?: boolean;\n /**\n * Текст для кнопки Найти.\n */\n findButtonText?: string;\n /**\n * Обработчик, при нажатии на кнопку \"Найти\".\n */\n onFindButtonClick?: React.MouseEventHandler<HTMLElement>;\n /**\n * Передает атрибут `data-testid` для кнопки поиска.\n */\n findButtonTestId?: string;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Search\n */\nexport const Search = ({\n id: idProp,\n before = <Icon16SearchOutline />,\n className,\n placeholder = 'Поиск',\n after = 'Отмена',\n getRef,\n icon: iconProp,\n onIconClick,\n style,\n autoComplete = 'off',\n onChange,\n iconLabel,\n clearLabel = 'Очистить',\n clearButtonTestId,\n noPadding,\n getRootRef,\n findButtonText = 'Найти',\n findButtonTestId,\n onFindButtonClick,\n ...inputProps\n}: SearchProps): React.ReactNode => {\n const direction = useConfigDirection();\n const isRtl = direction === 'rtl';\n const inputRef = useExternRef(getRef);\n const {\n value: isFocused,\n setTrue: setFocusedTrue,\n setFalse: setFocusedFalse,\n } = useBooleanState(false);\n const generatedId = React.useId();\n const inputId = idProp ? idProp : `search-${generatedId}`;\n\n const [hasValue, setHasValue] = React.useState<boolean>(() =>\n Boolean(inputProps.value || inputProps.defaultValue),\n );\n const checkHasValue: React.ChangeEventHandler<HTMLInputElement> = (e) =>\n setHasValue(Boolean(e.currentTarget.value));\n\n const { sizeY = 'none' } = useAdaptivity();\n const { sizeY: adaptiveSizeY } = useAdaptivityConditionalRender();\n const platform = usePlatform();\n\n const hasAfter = platform === 'ios' && hasReactNode(after);\n\n const onFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocusedTrue();\n inputProps.onFocus && inputProps.onFocus(e);\n };\n\n const onBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocusedFalse();\n inputProps.onBlur && inputProps.onBlur(e);\n };\n\n const onCancel = React.useCallback(() => {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n HTMLInputElement.prototype,\n 'value',\n )?.set;\n nativeInputValueSetter?.call(inputRef.current, '');\n\n const ev2 = new Event('input', { bubbles: true });\n inputRef.current?.dispatchEvent(ev2);\n }, [inputRef]);\n\n const onIconClickStart: React.PointerEventHandler<HTMLElement> = React.useCallback(\n (e) => onIconClick?.(e),\n [onIconClick],\n );\n\n const onIconCancelClickStart: React.PointerEventHandler<HTMLElement> = React.useCallback(\n (e) => {\n e.preventDefault();\n inputRef.current?.focus();\n if (touchEnabled()) {\n onCancel();\n }\n },\n [inputRef, onCancel],\n );\n\n useIsomorphicLayoutEffect(() => {\n if (inputProps.value !== undefined) {\n setHasValue(Boolean(inputProps.value));\n }\n }, [inputProps.value]);\n\n useNativeFormResetListener(inputRef, () => {\n setHasValue(Boolean(inputProps.defaultValue));\n });\n\n const renderIconButton: RenderIconButtonFn = (icon, props = {}) => (\n <IconButton\n hoverMode=\"opacity\"\n onPointerDown={onIconClickStart}\n className={styles.icon}\n onFocus={setFocusedTrue}\n onBlur={setFocusedFalse}\n onClick={noop}\n {...props}\n >\n <VisuallyHidden>{iconLabel}</VisuallyHidden>\n {icon}\n </IconButton>\n );\n\n return (\n <div\n className={classNames(\n 'vkuiInternalSearch',\n styles.host,\n sizeY === 'none' && styles.sizeYNone,\n sizeY === 'compact' && styles.sizeYCompact,\n isFocused && styles.focused,\n hasValue && styles.hasValue,\n hasAfter && styles.hasAfter,\n iconProp && styles.hasIcon,\n inputProps.disabled && styles.disabled,\n !noPadding && styles.withPadding,\n isRtl && styles.rtl,\n className,\n )}\n ref={getRootRef}\n style={style}\n >\n <div className={styles.field}>\n <label htmlFor={inputId} className={styles.label}>\n {placeholder}\n </label>\n <div className={styles.input}>\n {before}\n <Headline\n Component=\"input\"\n type=\"search\"\n level=\"1\"\n weight=\"3\"\n {...inputProps}\n id={inputId}\n placeholder={placeholder}\n autoComplete={autoComplete}\n getRootRef={inputRef}\n className={styles.nativeInput}\n onFocus={onFocus}\n onBlur={onBlur}\n onChange={callMultiple(onChange, checkHasValue)}\n />\n </div>\n <div className={styles.controls}>\n {iconProp &&\n (typeof iconProp === 'function'\n ? iconProp(renderIconButton)\n : renderIconButton(iconProp))}\n <IconButton\n hoverMode=\"opacity\"\n onPointerDown={onIconCancelClickStart}\n onClick={onCancel}\n className={styles.icon}\n tabIndex={hasValue ? undefined : -1}\n disabled={inputProps.disabled}\n data-testid={clearButtonTestId}\n >\n <VisuallyHidden>{clearLabel}</VisuallyHidden>\n {platform === 'ios' ? <Icon16Clear /> : <Icon24Cancel />}\n </IconButton>\n {adaptiveSizeY.compact && onFindButtonClick && (\n <Button\n mode=\"primary\"\n size=\"m\"\n className={classNames(styles.findButton, adaptiveSizeY.compact.className)}\n focusVisibleMode=\"inside\"\n onClick={onFindButtonClick}\n tabIndex={hasValue ? undefined : -1}\n data-testid={findButtonTestId}\n >\n {findButtonText}\n </Button>\n )}\n </div>\n </div>\n {hasAfter && (\n <div className={styles.after}>\n <Button\n mode=\"tertiary\"\n size=\"m\"\n focusVisibleMode=\"inside\"\n hoverMode=\"opacity\"\n activeMode=\"opacity\"\n onClick={onCancel}\n onFocus={setFocusedTrue}\n onBlur={setFocusedFalse}\n >\n <span className={styles.afterTextClip}>{after}</span>\n </Button>\n </div>\n )}\n </div>\n );\n};\n"],"names":["React","Icon16Clear","Icon16SearchOutline","Icon24Cancel","classNames","hasReactNode","noop","useAdaptivity","useAdaptivityConditionalRender","useBooleanState","useConfigDirection","useExternRef","useNativeFormResetListener","usePlatform","callMultiple","touchEnabled","useIsomorphicLayoutEffect","Button","IconButton","Headline","VisuallyHidden","Search","id","idProp","before","className","placeholder","after","getRef","icon","iconProp","onIconClick","style","autoComplete","onChange","iconLabel","clearLabel","clearButtonTestId","noPadding","getRootRef","findButtonText","findButtonTestId","onFindButtonClick","inputProps","direction","isRtl","inputRef","value","isFocused","setTrue","setFocusedTrue","setFalse","setFocusedFalse","generatedId","useId","inputId","hasValue","setHasValue","useState","Boolean","defaultValue","checkHasValue","e","currentTarget","sizeY","adaptiveSizeY","platform","hasAfter","onFocus","onBlur","onCancel","useCallback","Object","nativeInputValueSetter","getOwnPropertyDescriptor","HTMLInputElement","prototype","set","call","current","ev2","Event","bubbles","dispatchEvent","onIconClickStart","onIconCancelClickStart","preventDefault","focus","undefined","renderIconButton","props","hoverMode","onPointerDown","onClick","div","disabled","ref","label","htmlFor","Component","type","level","weight","tabIndex","data-testid","compact","mode","size","focusVisibleMode","activeMode","span"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/Search/Search.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Icon16Clear, Icon16SearchOutline, Icon24Cancel } from '@vkontakte/icons';\nimport { classNames, hasReactNode, noop } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useAdaptivityConditionalRender } from '../../hooks/useAdaptivityConditionalRender';\nimport { useBooleanState } from '../../hooks/useBooleanState';\nimport { useConfigDirection } from '../../hooks/useConfigDirection';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useNativeFormResetListener } from '../../hooks/useNativeFormResetListener';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { touchEnabled } from '../../lib/touch';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport type { HasDataAttribute, HasRef, HasRootRef } from '../../types';\nimport { Button } from '../Button/Button';\nimport { IconButton, type IconButtonProps } from '../IconButton/IconButton';\nimport { Headline } from '../Typography/Headline/Headline';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport styles from './Search.module.css';\n\nexport type RenderIconButtonFn = (\n icon: React.ReactNode,\n props?: Partial<IconButtonProps> & HasDataAttribute,\n) => React.ReactElement;\n\nexport interface SearchProps\n extends React.InputHTMLAttributes<HTMLInputElement>,\n HasRootRef<HTMLDivElement>,\n HasRef<HTMLInputElement> {\n /**\n * Only iOS. Текст кнопки \"отмена\", которая чистит текстовое поле и убирает фокус.\n */\n after?: React.ReactNode;\n /**\n * Контент, отображаемый перед полем ввода.\n */\n before?: React.ReactNode;\n /**\n * Иконка поиска. Может быть React-элементом или функцией, возвращающей элемент.\n */\n icon?: React.ReactNode | ((renderFn: RenderIconButtonFn) => React.ReactNode);\n /**\n * Обработчик нажатия на иконку поиска.\n */\n onIconClick?: React.PointerEventHandler<HTMLElement>;\n /**\n * Значение поля ввода по умолчанию.\n */\n defaultValue?: string;\n /**\n * Текст для скринридеров, описывающий иконку поиска.\n */\n iconLabel?: string;\n /**\n * Текст для скринридеров, описывающий кнопку очистки.\n */\n clearLabel?: string;\n /**\n * Передает атрибут `data-testid` для кнопки очистки.\n */\n clearButtonTestId?: string;\n /**\n * Удаляет отступы у компонента.\n */\n noPadding?: boolean;\n /**\n * Текст для кнопки Найти.\n */\n findButtonText?: string;\n /**\n * Обработчик, при нажатии на кнопку \"Найти\".\n */\n onFindButtonClick?: React.MouseEventHandler<HTMLElement>;\n /**\n * Передает атрибут `data-testid` для кнопки поиска.\n */\n findButtonTestId?: string;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Search\n */\nexport const Search = ({\n id: idProp,\n before = <Icon16SearchOutline />,\n className,\n placeholder = 'Поиск',\n after = 'Отмена',\n getRef,\n icon: iconProp,\n onIconClick,\n style,\n autoComplete = 'off',\n onChange,\n iconLabel,\n clearLabel = 'Очистить',\n clearButtonTestId,\n noPadding,\n getRootRef,\n findButtonText = 'Найти',\n findButtonTestId,\n onFindButtonClick,\n ...inputProps\n}: SearchProps): React.ReactNode => {\n const direction = useConfigDirection();\n const isRtl = direction === 'rtl';\n const inputRef = useExternRef(getRef);\n const {\n value: isFocused,\n setTrue: setFocusedTrue,\n setFalse: setFocusedFalse,\n } = useBooleanState(false);\n const generatedId = React.useId();\n const inputId = idProp ? idProp : `search-${generatedId}`;\n\n const [hasValue, setHasValue] = React.useState<boolean>(() =>\n Boolean(inputProps.value || inputProps.defaultValue),\n );\n const checkHasValue: React.ChangeEventHandler<HTMLInputElement> = (e) =>\n setHasValue(Boolean(e.currentTarget.value));\n\n const { sizeY = 'none' } = useAdaptivity();\n const { sizeY: adaptiveSizeY } = useAdaptivityConditionalRender();\n const platform = usePlatform();\n\n const hasAfter = platform === 'ios' && hasReactNode(after);\n\n const onFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocusedTrue();\n inputProps.onFocus && inputProps.onFocus(e);\n };\n\n const onBlur = (e: React.FocusEvent<HTMLInputElement>) => {\n setFocusedFalse();\n inputProps.onBlur && inputProps.onBlur(e);\n };\n\n const onCancel = React.useCallback(() => {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n const nativeInputValueSetter = Object.getOwnPropertyDescriptor(\n HTMLInputElement.prototype,\n 'value',\n )?.set;\n nativeInputValueSetter?.call(inputRef.current, '');\n\n const ev2 = new Event('input', { bubbles: true });\n inputRef.current?.dispatchEvent(ev2);\n }, [inputRef]);\n\n const onIconClickStart: React.PointerEventHandler<HTMLElement> = React.useCallback(\n (e) => onIconClick?.(e),\n [onIconClick],\n );\n\n const onIconCancelClickStart: React.PointerEventHandler<HTMLElement> = React.useCallback(\n (e) => {\n e.preventDefault();\n inputRef.current?.focus();\n if (touchEnabled()) {\n onCancel();\n }\n },\n [inputRef, onCancel],\n );\n\n useIsomorphicLayoutEffect(() => {\n if (inputProps.value !== undefined) {\n setHasValue(Boolean(inputProps.value));\n }\n }, [inputProps.value]);\n\n useNativeFormResetListener(inputRef, () => {\n setHasValue(Boolean(inputProps.defaultValue));\n });\n\n const renderIconButton: RenderIconButtonFn = (icon, props = {}) => (\n <IconButton\n hoverMode=\"opacity\"\n onPointerDown={onIconClickStart}\n className={styles.icon}\n onFocus={setFocusedTrue}\n onBlur={setFocusedFalse}\n onClick={noop}\n {...props}\n >\n <VisuallyHidden>{iconLabel}</VisuallyHidden>\n {icon}\n </IconButton>\n );\n\n return (\n <div\n className={classNames(\n 'vkuiInternalSearch',\n styles.host,\n sizeY === 'none' && styles.sizeYNone,\n sizeY === 'compact' && styles.sizeYCompact,\n isFocused && styles.focused,\n hasValue && styles.hasValue,\n hasAfter && styles.hasAfter,\n iconProp && styles.hasIcon,\n inputProps.disabled && styles.disabled,\n !noPadding && styles.withPadding,\n isRtl && styles.rtl,\n className,\n )}\n ref={getRootRef}\n style={style}\n >\n <div className={styles.field}>\n <label htmlFor={inputId} className={styles.label}>\n {placeholder}\n </label>\n <div className={styles.input}>\n {before}\n <Headline\n Component=\"input\"\n type=\"search\"\n level=\"1\"\n weight=\"3\"\n {...inputProps}\n id={inputId}\n placeholder={placeholder}\n autoComplete={autoComplete}\n getRootRef={inputRef}\n className={styles.nativeInput}\n onFocus={onFocus}\n onBlur={onBlur}\n onChange={callMultiple(onChange, checkHasValue)}\n />\n </div>\n <div className={styles.controls}>\n {iconProp &&\n (typeof iconProp === 'function'\n ? iconProp(renderIconButton)\n : renderIconButton(iconProp))}\n <IconButton\n hoverMode=\"opacity\"\n onPointerDown={onIconCancelClickStart}\n onClick={onCancel}\n className={styles.icon}\n tabIndex={hasValue ? undefined : -1}\n disabled={inputProps.disabled}\n data-testid={clearButtonTestId}\n >\n <VisuallyHidden>{clearLabel}</VisuallyHidden>\n {platform === 'ios' ? <Icon16Clear /> : <Icon24Cancel />}\n </IconButton>\n {adaptiveSizeY.compact && onFindButtonClick && (\n <Button\n mode=\"primary\"\n size=\"m\"\n className={classNames(styles.findButton, adaptiveSizeY.compact.className)}\n focusVisibleMode=\"inside\"\n onClick={onFindButtonClick}\n tabIndex={hasValue ? undefined : -1}\n data-testid={findButtonTestId}\n >\n {findButtonText}\n </Button>\n )}\n </div>\n </div>\n {hasAfter && (\n <div className={styles.after}>\n <Button\n mode=\"tertiary\"\n size=\"m\"\n focusVisibleMode=\"inside\"\n hoverMode=\"opacity\"\n activeMode=\"opacity\"\n onClick={onCancel}\n onFocus={setFocusedTrue}\n onBlur={setFocusedFalse}\n >\n <span className={styles.afterTextClip}>{after}</span>\n </Button>\n </div>\n )}\n </div>\n );\n};\n"],"names":["React","Icon16Clear","Icon16SearchOutline","Icon24Cancel","classNames","hasReactNode","noop","useAdaptivity","useAdaptivityConditionalRender","useBooleanState","useConfigDirection","useExternRef","useNativeFormResetListener","usePlatform","callMultiple","touchEnabled","useIsomorphicLayoutEffect","Button","IconButton","Headline","VisuallyHidden","Search","id","idProp","before","className","placeholder","after","getRef","icon","iconProp","onIconClick","style","autoComplete","onChange","iconLabel","clearLabel","clearButtonTestId","noPadding","getRootRef","findButtonText","findButtonTestId","onFindButtonClick","inputProps","direction","isRtl","inputRef","value","isFocused","setTrue","setFocusedTrue","setFalse","setFocusedFalse","generatedId","useId","inputId","hasValue","setHasValue","useState","Boolean","defaultValue","checkHasValue","e","currentTarget","sizeY","adaptiveSizeY","platform","hasAfter","onFocus","onBlur","onCancel","useCallback","Object","nativeInputValueSetter","getOwnPropertyDescriptor","HTMLInputElement","prototype","set","call","current","ev2","Event","bubbles","dispatchEvent","onIconClickStart","onIconCancelClickStart","preventDefault","focus","undefined","renderIconButton","props","hoverMode","onPointerDown","onClick","div","disabled","ref","label","htmlFor","Component","type","level","weight","tabIndex","data-testid","compact","mode","size","focusVisibleMode","activeMode","span"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Touch.d.ts","sourceRoot":"","sources":["../../../src/components/Touch/Touch.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAgC,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAkC5D,MAAM,WAAW,gBAAiB,SAAQ,OAAO;IAC/C;;OAEG;IACH,aAAa,EAAE,cAAc,CAAC;CAC/B;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,WAAW,EAAE,UAAU,KAAK,IAAI,CAAC;AAE7D,MAAM,MAAM,uBAAuB,GAAG,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAExE,MAAM,WAAW,UACf,SAAQ,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAC1C,UAAU,CAAC,WAAW,CAAC,EACvB,YAAY;IACd;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB;;OAEG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB;;OAEG;IACH,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC;;OAEG;IACH,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC;;OAEG;IACH,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC;;OAEG;IACH,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC;;OAEG;IACH,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC;;OAEG;IACH,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC;;OAEG;IACH,KAAK,CAAC,EAAE,uBAAuB,CAAC;IAChC;;OAEG;IACH,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC;;OAEG;IACH,MAAM,CAAC,EAAE,uBAAuB,CAAC;CAClC;AAED,MAAM,WAAW,OAAO;IACtB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,MAAM,EAAE,IAAI,CAAC;IAEb;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,GAAG,EAAE,OAAO,CAAC;IAEb;;OAEG;IACH,GAAG,EAAE,OAAO,CAAC;IAEb;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,KAAK,GAAI,qOAqBnB,UAAU,4CAqNZ,CAAC"}
1
+ {"version":3,"file":"Touch.d.ts","sourceRoot":"","sources":["../../../src/components/Touch/Touch.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,EAAgC,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEpF,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAkC5D,MAAM,WAAW,gBAAiB,SAAQ,OAAO;IAC/C;;OAEG;IACH,aAAa,EAAE,cAAc,CAAC;CAC/B;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,WAAW,EAAE,UAAU,KAAK,IAAI,CAAC;AAE7D,MAAM,MAAM,uBAAuB,GAAG,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;AAExE,MAAM,WAAW,UACf,SAAQ,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAC1C,UAAU,CAAC,WAAW,CAAC,EACvB,YAAY;IACd;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB;;OAEG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB;;OAEG;IACH,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC;;OAEG;IACH,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC;;OAEG;IACH,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC;;OAEG;IACH,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC;;OAEG;IACH,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC;;OAEG;IACH,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC;;OAEG;IACH,KAAK,CAAC,EAAE,uBAAuB,CAAC;IAChC;;OAEG;IACH,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC;;OAEG;IACH,MAAM,CAAC,EAAE,uBAAuB,CAAC;CAClC;AAED,MAAM,WAAW,OAAO;IACtB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,MAAM,EAAE,IAAI,CAAC;IAEb;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,GAAG,EAAE,OAAO,CAAC;IAEb;;OAEG;IACH,GAAG,EAAE,OAAO,CAAC;IAEb;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,eAAO,MAAM,KAAK,GAAI,qOAqBnB,UAAU,4CAqOZ,CAAC"}
@@ -4,9 +4,11 @@ import { _ as _object_spread_props } from "@swc/helpers/_/_object_spread_props";
4
4
  import { _ as _object_without_properties } from "@swc/helpers/_/_object_without_properties";
5
5
  import { jsx as _jsx } from "react/jsx-runtime";
6
6
  import * as React from "react";
7
+ import { useExternRef } from "../../hooks/useExternRef.js";
7
8
  import { useStableCallback } from "../../hooks/useStableCallback.js";
8
9
  import { getWindow, isHTMLElement, isSVGElement } from "../../lib/dom.js";
9
10
  import { coordX, coordY, touchEnabled } from "../../lib/touch/index.js";
11
+ import { useIsomorphicLayoutEffect } from "../../lib/useIsomorphicLayoutEffect.js";
10
12
  /**
11
13
  * @see https://vkcom.github.io/VKUI/#/Touch
12
14
  */ export const Touch = (_param)=>{
@@ -31,6 +33,7 @@ import { coordX, coordY, touchEnabled } from "../../lib/touch/index.js";
31
33
  "noSlideClick",
32
34
  "stopPropagation"
33
35
  ]);
36
+ const hostRef = useExternRef(getRootRef);
34
37
  const [isTouchEnabled] = React.useState(touchEnabled);
35
38
  const gestureRef = React.useRef(null);
36
39
  const didSlide = React.useRef(false);
@@ -118,8 +121,8 @@ import { coordX, coordY, touchEnabled } from "../../lib/touch/index.js";
118
121
  ], stopPropagation);
119
122
  }
120
123
  });
121
- const handlePointerDown = (event)=>{
122
- const nativeEvent = event.nativeEvent;
124
+ const handlePointerDown = useStableCallback((event)=>{
125
+ const nativeEvent = 'nativeEvent' in event ? event.nativeEvent : event;
123
126
  gestureRef.current = initGesture(coordX(nativeEvent), coordY(nativeEvent));
124
127
  const shouldCallDirectionHandlerOnlyIsSlide = false;
125
128
  dispatchUserHandlers(event, gestureRef.current, [
@@ -160,7 +163,7 @@ import { coordX, coordY, touchEnabled } from "../../lib/touch/index.js";
160
163
  doc.removeEventListener('mouseleave', handleNativePointerUp, eventOptions);
161
164
  };
162
165
  }
163
- };
166
+ });
164
167
  const handlePointerEnter = onEnter ? (event)=>onEnter(event.nativeEvent) : undefined;
165
168
  const handlePointerLeave = onLeave ? (event)=>onLeave(event.nativeEvent) : undefined;
166
169
  /**
@@ -187,8 +190,27 @@ import { coordX, coordY, touchEnabled } from "../../lib/touch/index.js";
187
190
  }
188
191
  didSlide.current = false;
189
192
  };
193
+ useIsomorphicLayoutEffect(function initializeNativeTouchStartEventWithPassiveFalse() {
194
+ const hostEl = hostRef.current;
195
+ if (!hostEl || !isTouchEnabled) {
196
+ return;
197
+ }
198
+ const options = {
199
+ capture: useCapture,
200
+ passive: false
201
+ };
202
+ hostEl.addEventListener('touchstart', handlePointerDown, options);
203
+ return ()=>{
204
+ hostEl.removeEventListener('touchstart', handlePointerDown, options);
205
+ };
206
+ }, [
207
+ hostRef,
208
+ isTouchEnabled,
209
+ useCapture,
210
+ handlePointerDown
211
+ ]);
190
212
  return /*#__PURE__*/ _jsx(Component, _object_spread_props(_object_spread({}, restProps), {
191
- ref: getRootRef,
213
+ ref: hostRef,
192
214
  onDragStart: handleDragStart,
193
215
  onClickCapture: handleClickCapture,
194
216
  // onEnter
@@ -197,9 +219,7 @@ import { coordX, coordY, touchEnabled } from "../../lib/touch/index.js";
197
219
  // onLeave
198
220
  onPointerLeave: usePointerHover ? handlePointerLeave : undefined,
199
221
  onMouseLeave: !usePointerHover ? handlePointerLeave : undefined,
200
- // handlePointerDown
201
- onTouchStartCapture: isTouchEnabled && useCapture ? handlePointerDown : undefined,
202
- onTouchStart: isTouchEnabled && !useCapture ? handlePointerDown : undefined,
222
+ // handlePointerDown (onTouchStart устанавливается отдельно через initializeNativeTouchEventStartWithPassiveFalse)
203
223
  onMouseDownCapture: !isTouchEnabled && useCapture ? handlePointerDown : undefined,
204
224
  onMouseDown: !isTouchEnabled && !useCapture ? handlePointerDown : undefined
205
225
  }));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/Touch/Touch.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useStableCallback } from '../../hooks/useStableCallback';\nimport { getWindow, isHTMLElement, isSVGElement } from '../../lib/dom';\nimport { coordX, coordY, touchEnabled, type VKUITouchEvent } from '../../lib/touch';\nimport type { HasComponent, HasRootRef } from '../../types';\n\n/**\n * Костыль для правильной работы тайпскрипта.\n */\ntype HTMLorSVGElementWithEvents = {\n /**\n * AddEventListener.\n */\n addEventListener: (<K extends keyof HTMLElementEventMap>(\n type: K,\n listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any,\n options?: boolean | AddEventListenerOptions,\n ) => void) &\n (<K extends keyof SVGElementEventMap>(\n type: K,\n listener: (this: SVGElement, ev: SVGElementEventMap[K]) => any,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n /**\n * RemoveEventListener.\n */\n removeEventListener: (<K extends keyof HTMLElementEventMap>(\n type: K,\n listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any,\n options?: boolean | EventListenerOptions,\n ) => void) &\n (<K extends keyof SVGElementEventMap>(\n type: K,\n listener: (this: SVGElement, ev: SVGElementEventMap[K]) => any,\n options?: boolean | EventListenerOptions,\n ) => void);\n};\n\nexport interface CustomTouchEvent extends Gesture {\n /**\n * Оригинальное событие.\n */\n originalEvent: VKUITouchEvent;\n}\n\nexport type HoverHandler = (outputEvent: MouseEvent) => void;\n\nexport type CustomTouchEventHandler = (event: CustomTouchEvent) => void;\n\nexport interface TouchProps\n extends React.AllHTMLAttributes<HTMLElement>,\n HasRootRef<HTMLElement>,\n HasComponent {\n /**\n * Использовать pointer-events для hover-состояний.\n * Работает на отключенных элементах (disabled inputs).\n */\n usePointerHover?: boolean;\n /**\n * Использовать фазу capture для событий.\n */\n useCapture?: boolean;\n /**\n * Порог расстояния в пикселях для активации свайпа.\n * @default 5\n */\n slideThreshold?: number;\n /**\n * Блокировать click-события после распознавания свайпа.\n */\n noSlideClick?: boolean;\n /**\n * Останавливать всплытие событий.\n */\n stopPropagation?: boolean;\n /**\n * Обработчик входа курсора в область.\n */\n onEnter?: HoverHandler;\n /**\n * Обработчик выхода курсора из области.\n */\n onLeave?: HoverHandler;\n /**\n * Общий обработчик начала взаимодействия.\n */\n onStart?: CustomTouchEventHandler;\n /**\n * Обработчик начала горизонтального перемещения.\n */\n onStartX?: CustomTouchEventHandler;\n /**\n * Обработчик начала вертикального перемещения.\n */\n onStartY?: CustomTouchEventHandler;\n /**\n * Общий обработчик перемещения.\n */\n onMove?: CustomTouchEventHandler;\n /**\n * Обработчик горизонтального перемещения.\n */\n onMoveX?: CustomTouchEventHandler;\n /**\n * Обработчик вертикального перемещения.\n */\n onMoveY?: CustomTouchEventHandler;\n /**\n * Общий обработчик завершения взаимодействия.\n */\n onEnd?: CustomTouchEventHandler;\n /**\n * Обработчик завершения горизонтального свайпа.\n */\n onEndX?: CustomTouchEventHandler;\n /**\n * Обработчик завершения вертикального свайпа.\n */\n onEndY?: CustomTouchEventHandler;\n}\n\nexport interface Gesture {\n /**\n * Начальная X-координата касания.\n */\n startX: number;\n\n /**\n * Начальная Y-координата касания.\n */\n startY: number;\n\n /**\n * Время начала взаимодействия.\n */\n startT: Date;\n\n /**\n * Длительность взаимодействия в миллисекундах.\n */\n duration: number;\n\n /**\n * Флаг активного нажатия.\n */\n isPressed: boolean;\n\n /**\n * Флаг вертикального перемещения.\n */\n isY: boolean;\n\n /**\n * Флаг горизонтального перемещения.\n */\n isX: boolean;\n\n /**\n * Флаг горизонтального свайпа.\n */\n isSlideX: boolean;\n\n /**\n * Флаг вертикального свайпа.\n */\n isSlideY: boolean;\n\n /**\n * Общий флаг свайпа (вертикального или горизонтального).\n */\n isSlide: boolean;\n\n /**\n * Текущая X-координата курсора/касания.\n */\n clientX: number;\n\n /**\n * Текущая Y-координата курсора/касания.\n */\n clientY: number;\n\n /**\n * Смещение по X относительно начальной точки.\n */\n shiftX: number;\n\n /**\n * Смещение по Y относительно начальной точки.\n */\n shiftY: number;\n\n /**\n * Абсолютное смещение по X.\n */\n shiftXAbs: number;\n\n /**\n * Абсолютное смещение по Y.\n */\n shiftYAbs: number;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Touch\n */\nexport const Touch = ({\n onStart,\n onStartX,\n onStartY,\n onMove,\n onMoveX,\n onMoveY,\n onEnter,\n onLeave,\n onEnd,\n onEndX,\n onEndY,\n onClickCapture,\n usePointerHover,\n slideThreshold = 5,\n useCapture = false,\n Component = 'div',\n getRootRef,\n noSlideClick = false,\n stopPropagation = false,\n ...restProps\n}: TouchProps) => {\n const [isTouchEnabled] = React.useState(touchEnabled);\n const gestureRef = React.useRef<Gesture | null>(null);\n const didSlide = React.useRef(false);\n const disposeTargetNativeGestureEvents = React.useRef<VoidFunction | null>(null);\n\n const cleanupTargetNativeGestureEvents = () => {\n gestureRef.current = null;\n if (disposeTargetNativeGestureEvents.current) {\n disposeTargetNativeGestureEvents.current();\n disposeTargetNativeGestureEvents.current = null;\n }\n };\n\n React.useEffect(() => cleanupTargetNativeGestureEvents, []);\n\n /**\n * Note: используем `useStableCallback()`, чтобы не терялась область видимости `onEnd`/`onEndX`/`onEndY`.\n */\n const handleNativePointerUp = useStableCallback((event: MouseEvent | TouchEvent) => {\n const gesture = gestureRef.current;\n\n /* istanbul ignore if: нужно для Typescript */\n if (!gesture) {\n return;\n }\n\n if (gesture.isPressed) {\n dispatchUserHandlers(event, gesture, [onEnd, onEndX, onEndY], stopPropagation);\n }\n\n if (isTouchEnabled) {\n // https://github.com/VKCOM/VKUI/issues/4414\n // если тач-устройство и был зафиксирован touchmove,\n // то событие клика не вызывается\n if (gesture.isSlide) {\n didSlide.current = false;\n }\n // Если это был тач-евент, симулируем отмену hover\n if (onLeave) {\n onLeave(event as MouseEvent);\n }\n } else {\n didSlide.current = Boolean(gesture.isSlide);\n }\n\n cleanupTargetNativeGestureEvents();\n });\n\n /**\n * Note: используем `useStableCallback()`, чтобы не терялась область видимости `onMove`/`onMoveX`/`onMoveY`.\n */\n const handleNativePointerMove = useStableCallback((event: MouseEvent | TouchEvent) => {\n const gesture = gestureRef.current;\n\n /* istanbul ignore if: нужно для Typescript */\n if (!gesture) {\n return;\n }\n\n const clientX = coordX(event);\n const clientY = coordY(event);\n\n // смещения\n const shiftX = clientX - gesture.startX;\n const shiftY = clientY - gesture.startY;\n\n // абсолютные значения смещений\n const shiftXAbs = Math.abs(shiftX);\n const shiftYAbs = Math.abs(shiftY);\n\n // Если определяем мультитач, то прерываем жест\n if ('touches' in event && event.touches.length > 1) {\n return handleNativePointerUp(event);\n }\n\n // если мы ещё не определились\n if (!gesture.isX && !gesture.isY) {\n const willBeX = shiftXAbs >= slideThreshold && shiftXAbs > shiftYAbs;\n const willBeY = shiftYAbs >= slideThreshold && shiftYAbs > shiftXAbs;\n const willBeSlidedX = willBeX && (!!onMoveX || !!onMove);\n const willBeSlidedY = willBeY && (!!onMoveY || !!onMove);\n\n gesture.isY = willBeY;\n gesture.isX = willBeX;\n gesture.isSlideX = willBeSlidedX;\n gesture.isSlideY = willBeSlidedY;\n gesture.isSlide = willBeSlidedX || willBeSlidedY;\n }\n\n if (gesture.isSlide) {\n gesture.clientX = clientX;\n gesture.clientY = clientY;\n gesture.shiftX = shiftX;\n gesture.shiftY = shiftY;\n gesture.shiftXAbs = shiftXAbs;\n gesture.shiftYAbs = shiftYAbs;\n\n dispatchUserHandlers(event, gesture, [onMove, onMoveX, onMoveY], stopPropagation);\n }\n });\n\n const handlePointerDown = (\n event: React.MouseEvent<HTMLElement> | React.TouchEvent<HTMLElement>,\n ) => {\n const nativeEvent = event.nativeEvent;\n\n gestureRef.current = initGesture(coordX(nativeEvent), coordY(nativeEvent));\n\n const shouldCallDirectionHandlerOnlyIsSlide = false;\n dispatchUserHandlers(\n event,\n gestureRef.current,\n [onStart, onStartX, onStartY],\n stopPropagation,\n shouldCallDirectionHandlerOnlyIsSlide,\n );\n\n const eventOptions = { capture: useCapture, passive: false };\n\n // FIXME: заменить touch/mouse-события ниже на pointer-события после того, как бразуеры из\n // .browserslistrc начнут поддерживать его (см. https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events#browser_compatibility).\n if (isTouchEnabled) {\n if (isHTMLElement(event.target) || isSVGElement(event.target)) {\n // Тач-события не всплывают, поэтому навешиваем события на целевой элемент\n // см. #235, #1968, https://stackoverflow.com/a/45760014\n const target: HTMLorSVGElementWithEvents = event.target;\n\n target.addEventListener('touchmove', handleNativePointerMove, eventOptions);\n target.addEventListener('touchend', handleNativePointerUp, eventOptions);\n target.addEventListener('touchcancel', handleNativePointerUp, eventOptions);\n\n disposeTargetNativeGestureEvents.current = () => {\n target.removeEventListener('touchmove', handleNativePointerMove, eventOptions);\n target.removeEventListener('touchend', handleNativePointerUp, eventOptions);\n target.removeEventListener('touchcancel', handleNativePointerUp, eventOptions);\n };\n }\n } else {\n // Используем события на Document, т.к. mouse-события на целевом элементе могут теряться при\n // выходе за границы этого элемента.\n const doc = getWindow(event.currentTarget).document;\n\n doc.addEventListener('mousemove', handleNativePointerMove, eventOptions);\n doc.addEventListener('mouseup', handleNativePointerUp, eventOptions);\n doc.addEventListener('mouseleave', handleNativePointerUp, eventOptions);\n\n disposeTargetNativeGestureEvents.current = () => {\n doc.removeEventListener('mousemove', handleNativePointerMove, eventOptions);\n doc.removeEventListener('mouseup', handleNativePointerUp, eventOptions);\n doc.removeEventListener('mouseleave', handleNativePointerUp, eventOptions);\n };\n }\n };\n\n const handlePointerEnter = onEnter\n ? (event: React.MouseEvent<HTMLElement>) => onEnter(event.nativeEvent)\n : undefined;\n\n const handlePointerLeave = onLeave\n ? (event: React.MouseEvent<HTMLElement>) => onLeave(event.nativeEvent)\n : undefined;\n\n /**\n * Отменяет нативное браузерное поведение для вложенных ссылок и изображений.\n */\n const handleDragStart = (event: React.DragEvent<HTMLElement>) => {\n const target = event.target as HTMLElement;\n if (target.tagName === 'A' || target.tagName === 'IMG') {\n event.preventDefault();\n }\n };\n\n /**\n * Отменяет переход по вложенной ссылке, если был зафиксирован свайп.\n */\n const handleClickCapture: typeof onClickCapture = (event) => {\n if (!didSlide.current) {\n return onClickCapture && onClickCapture(event);\n }\n\n if (noSlideClick) {\n event.stopPropagation();\n\n // https://github.com/VKCOM/VKUI/issues/1977\n // https://github.com/VKCOM/VKUI/issues/3892\n event.preventDefault();\n } else {\n onClickCapture && onClickCapture(event);\n }\n\n didSlide.current = false;\n };\n\n return (\n <Component\n {...restProps}\n ref={getRootRef}\n onDragStart={handleDragStart}\n onClickCapture={handleClickCapture}\n // onEnter\n onPointerEnter={usePointerHover ? handlePointerEnter : undefined}\n onMouseEnter={!usePointerHover ? handlePointerEnter : undefined}\n // onLeave\n onPointerLeave={usePointerHover ? handlePointerLeave : undefined}\n onMouseLeave={!usePointerHover ? handlePointerLeave : undefined}\n // handlePointerDown\n onTouchStartCapture={isTouchEnabled && useCapture ? handlePointerDown : undefined}\n onTouchStart={isTouchEnabled && !useCapture ? handlePointerDown : undefined}\n onMouseDownCapture={!isTouchEnabled && useCapture ? handlePointerDown : undefined}\n onMouseDown={!isTouchEnabled && !useCapture ? handlePointerDown : undefined}\n />\n );\n};\n\nfunction initGesture(startX: number, startY: number): Gesture {\n return {\n startX,\n startY,\n startT: new Date(),\n duration: 0,\n isPressed: true,\n isY: false,\n isX: false,\n isSlideX: false,\n isSlideY: false,\n isSlide: false,\n clientX: 0,\n clientY: 0,\n shiftX: 0,\n shiftY: 0,\n shiftXAbs: 0,\n shiftYAbs: 0,\n };\n}\n\ntype Handlers = [\n CustomTouchEventHandler | undefined,\n CustomTouchEventHandler | undefined,\n CustomTouchEventHandler | undefined,\n];\n\nfunction dispatchUserHandlers(\n event: MouseEvent | TouchEvent | React.MouseEvent | React.TouchEvent,\n gesture: Gesture,\n [handler, handlerX, handlerY]: Handlers,\n stopPropagation?: boolean,\n shouldCallDirectionHandlerOnlyIsSlide = true,\n) {\n if (stopPropagation) {\n event.stopPropagation();\n }\n\n const data = {\n ...gesture,\n originalEvent: event as unknown as VKUITouchEvent,\n duration: Date.now() - gesture.startT.getTime(),\n };\n\n if (handler) {\n handler(data);\n }\n\n if (handlerX) {\n if (shouldCallDirectionHandlerOnlyIsSlide) {\n if (gesture.isSlideX) {\n handlerX(data);\n }\n } else {\n handlerX(data);\n }\n }\n\n if (handlerY) {\n if (shouldCallDirectionHandlerOnlyIsSlide) {\n if (gesture.isSlideY) {\n handlerY(data);\n }\n } else {\n handlerY(data);\n }\n }\n}\n"],"names":["React","useStableCallback","getWindow","isHTMLElement","isSVGElement","coordX","coordY","touchEnabled","Touch","onStart","onStartX","onStartY","onMove","onMoveX","onMoveY","onEnter","onLeave","onEnd","onEndX","onEndY","onClickCapture","usePointerHover","slideThreshold","useCapture","Component","getRootRef","noSlideClick","stopPropagation","restProps","isTouchEnabled","useState","gestureRef","useRef","didSlide","disposeTargetNativeGestureEvents","cleanupTargetNativeGestureEvents","current","useEffect","handleNativePointerUp","event","gesture","isPressed","dispatchUserHandlers","isSlide","Boolean","handleNativePointerMove","clientX","clientY","shiftX","startX","shiftY","startY","shiftXAbs","Math","abs","shiftYAbs","touches","length","isX","isY","willBeX","willBeY","willBeSlidedX","willBeSlidedY","isSlideX","isSlideY","handlePointerDown","nativeEvent","initGesture","shouldCallDirectionHandlerOnlyIsSlide","eventOptions","capture","passive","target","addEventListener","removeEventListener","doc","currentTarget","document","handlePointerEnter","undefined","handlePointerLeave","handleDragStart","tagName","preventDefault","handleClickCapture","ref","onDragStart","onPointerEnter","onMouseEnter","onPointerLeave","onMouseLeave","onTouchStartCapture","onTouchStart","onMouseDownCapture","onMouseDown","startT","Date","duration","handler","handlerX","handlerY","data","originalEvent","now","getTime"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/Touch/Touch.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useStableCallback } from '../../hooks/useStableCallback';\nimport { getWindow, isHTMLElement, isSVGElement } from '../../lib/dom';\nimport { coordX, coordY, touchEnabled, type VKUITouchEvent } from '../../lib/touch';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport type { HasComponent, HasRootRef } from '../../types';\n\n/**\n * Костыль для правильной работы тайпскрипта.\n */\ntype HTMLorSVGElementWithEvents = {\n /**\n * AddEventListener.\n */\n addEventListener: (<K extends keyof HTMLElementEventMap>(\n type: K,\n listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any,\n options?: boolean | AddEventListenerOptions,\n ) => void) &\n (<K extends keyof SVGElementEventMap>(\n type: K,\n listener: (this: SVGElement, ev: SVGElementEventMap[K]) => any,\n options?: boolean | AddEventListenerOptions,\n ) => void);\n /**\n * RemoveEventListener.\n */\n removeEventListener: (<K extends keyof HTMLElementEventMap>(\n type: K,\n listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any,\n options?: boolean | EventListenerOptions,\n ) => void) &\n (<K extends keyof SVGElementEventMap>(\n type: K,\n listener: (this: SVGElement, ev: SVGElementEventMap[K]) => any,\n options?: boolean | EventListenerOptions,\n ) => void);\n};\n\nexport interface CustomTouchEvent extends Gesture {\n /**\n * Оригинальное событие.\n */\n originalEvent: VKUITouchEvent;\n}\n\nexport type HoverHandler = (outputEvent: MouseEvent) => void;\n\nexport type CustomTouchEventHandler = (event: CustomTouchEvent) => void;\n\nexport interface TouchProps\n extends React.AllHTMLAttributes<HTMLElement>,\n HasRootRef<HTMLElement>,\n HasComponent {\n /**\n * Использовать pointer-events для hover-состояний.\n * Работает на отключенных элементах (disabled inputs).\n */\n usePointerHover?: boolean;\n /**\n * Использовать фазу capture для событий.\n */\n useCapture?: boolean;\n /**\n * Порог расстояния в пикселях для активации свайпа.\n * @default 5\n */\n slideThreshold?: number;\n /**\n * Блокировать click-события после распознавания свайпа.\n */\n noSlideClick?: boolean;\n /**\n * Останавливать всплытие событий.\n */\n stopPropagation?: boolean;\n /**\n * Обработчик входа курсора в область.\n */\n onEnter?: HoverHandler;\n /**\n * Обработчик выхода курсора из области.\n */\n onLeave?: HoverHandler;\n /**\n * Общий обработчик начала взаимодействия.\n */\n onStart?: CustomTouchEventHandler;\n /**\n * Обработчик начала горизонтального перемещения.\n */\n onStartX?: CustomTouchEventHandler;\n /**\n * Обработчик начала вертикального перемещения.\n */\n onStartY?: CustomTouchEventHandler;\n /**\n * Общий обработчик перемещения.\n */\n onMove?: CustomTouchEventHandler;\n /**\n * Обработчик горизонтального перемещения.\n */\n onMoveX?: CustomTouchEventHandler;\n /**\n * Обработчик вертикального перемещения.\n */\n onMoveY?: CustomTouchEventHandler;\n /**\n * Общий обработчик завершения взаимодействия.\n */\n onEnd?: CustomTouchEventHandler;\n /**\n * Обработчик завершения горизонтального свайпа.\n */\n onEndX?: CustomTouchEventHandler;\n /**\n * Обработчик завершения вертикального свайпа.\n */\n onEndY?: CustomTouchEventHandler;\n}\n\nexport interface Gesture {\n /**\n * Начальная X-координата касания.\n */\n startX: number;\n\n /**\n * Начальная Y-координата касания.\n */\n startY: number;\n\n /**\n * Время начала взаимодействия.\n */\n startT: Date;\n\n /**\n * Длительность взаимодействия в миллисекундах.\n */\n duration: number;\n\n /**\n * Флаг активного нажатия.\n */\n isPressed: boolean;\n\n /**\n * Флаг вертикального перемещения.\n */\n isY: boolean;\n\n /**\n * Флаг горизонтального перемещения.\n */\n isX: boolean;\n\n /**\n * Флаг горизонтального свайпа.\n */\n isSlideX: boolean;\n\n /**\n * Флаг вертикального свайпа.\n */\n isSlideY: boolean;\n\n /**\n * Общий флаг свайпа (вертикального или горизонтального).\n */\n isSlide: boolean;\n\n /**\n * Текущая X-координата курсора/касания.\n */\n clientX: number;\n\n /**\n * Текущая Y-координата курсора/касания.\n */\n clientY: number;\n\n /**\n * Смещение по X относительно начальной точки.\n */\n shiftX: number;\n\n /**\n * Смещение по Y относительно начальной точки.\n */\n shiftY: number;\n\n /**\n * Абсолютное смещение по X.\n */\n shiftXAbs: number;\n\n /**\n * Абсолютное смещение по Y.\n */\n shiftYAbs: number;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Touch\n */\nexport const Touch = ({\n onStart,\n onStartX,\n onStartY,\n onMove,\n onMoveX,\n onMoveY,\n onEnter,\n onLeave,\n onEnd,\n onEndX,\n onEndY,\n onClickCapture,\n usePointerHover,\n slideThreshold = 5,\n useCapture = false,\n Component = 'div',\n getRootRef,\n noSlideClick = false,\n stopPropagation = false,\n ...restProps\n}: TouchProps) => {\n const hostRef = useExternRef(getRootRef);\n const [isTouchEnabled] = React.useState(touchEnabled);\n const gestureRef = React.useRef<Gesture | null>(null);\n const didSlide = React.useRef(false);\n const disposeTargetNativeGestureEvents = React.useRef<VoidFunction | null>(null);\n\n const cleanupTargetNativeGestureEvents = () => {\n gestureRef.current = null;\n if (disposeTargetNativeGestureEvents.current) {\n disposeTargetNativeGestureEvents.current();\n disposeTargetNativeGestureEvents.current = null;\n }\n };\n\n React.useEffect(() => cleanupTargetNativeGestureEvents, []);\n\n /**\n * Note: используем `useStableCallback()`, чтобы не терялась область видимости `onEnd`/`onEndX`/`onEndY`.\n */\n const handleNativePointerUp = useStableCallback((event: MouseEvent | TouchEvent) => {\n const gesture = gestureRef.current;\n\n /* istanbul ignore if: нужно для Typescript */\n if (!gesture) {\n return;\n }\n\n if (gesture.isPressed) {\n dispatchUserHandlers(event, gesture, [onEnd, onEndX, onEndY], stopPropagation);\n }\n\n if (isTouchEnabled) {\n // https://github.com/VKCOM/VKUI/issues/4414\n // если тач-устройство и был зафиксирован touchmove,\n // то событие клика не вызывается\n if (gesture.isSlide) {\n didSlide.current = false;\n }\n // Если это был тач-евент, симулируем отмену hover\n if (onLeave) {\n onLeave(event as MouseEvent);\n }\n } else {\n didSlide.current = Boolean(gesture.isSlide);\n }\n\n cleanupTargetNativeGestureEvents();\n });\n\n /**\n * Note: используем `useStableCallback()`, чтобы не терялась область видимости `onMove`/`onMoveX`/`onMoveY`.\n */\n const handleNativePointerMove = useStableCallback((event: MouseEvent | TouchEvent) => {\n const gesture = gestureRef.current;\n\n /* istanbul ignore if: нужно для Typescript */\n if (!gesture) {\n return;\n }\n\n const clientX = coordX(event);\n const clientY = coordY(event);\n\n // смещения\n const shiftX = clientX - gesture.startX;\n const shiftY = clientY - gesture.startY;\n\n // абсолютные значения смещений\n const shiftXAbs = Math.abs(shiftX);\n const shiftYAbs = Math.abs(shiftY);\n\n // Если определяем мультитач, то прерываем жест\n if ('touches' in event && event.touches.length > 1) {\n return handleNativePointerUp(event);\n }\n\n // если мы ещё не определились\n if (!gesture.isX && !gesture.isY) {\n const willBeX = shiftXAbs >= slideThreshold && shiftXAbs > shiftYAbs;\n const willBeY = shiftYAbs >= slideThreshold && shiftYAbs > shiftXAbs;\n const willBeSlidedX = willBeX && (!!onMoveX || !!onMove);\n const willBeSlidedY = willBeY && (!!onMoveY || !!onMove);\n\n gesture.isY = willBeY;\n gesture.isX = willBeX;\n gesture.isSlideX = willBeSlidedX;\n gesture.isSlideY = willBeSlidedY;\n gesture.isSlide = willBeSlidedX || willBeSlidedY;\n }\n\n if (gesture.isSlide) {\n gesture.clientX = clientX;\n gesture.clientY = clientY;\n gesture.shiftX = shiftX;\n gesture.shiftY = shiftY;\n gesture.shiftXAbs = shiftXAbs;\n gesture.shiftYAbs = shiftYAbs;\n\n dispatchUserHandlers(event, gesture, [onMove, onMoveX, onMoveY], stopPropagation);\n }\n });\n\n const handlePointerDown = useStableCallback(\n (event: React.MouseEvent<HTMLElement> | React.TouchEvent<HTMLElement> | TouchEvent) => {\n const nativeEvent = 'nativeEvent' in event ? event.nativeEvent : event;\n\n gestureRef.current = initGesture(coordX(nativeEvent), coordY(nativeEvent));\n\n const shouldCallDirectionHandlerOnlyIsSlide = false;\n dispatchUserHandlers(\n event,\n gestureRef.current,\n [onStart, onStartX, onStartY],\n stopPropagation,\n shouldCallDirectionHandlerOnlyIsSlide,\n );\n\n const eventOptions = { capture: useCapture, passive: false };\n\n // FIXME: заменить touch/mouse-события ниже на pointer-события после того, как бразуеры из\n // .browserslistrc начнут поддерживать его (см. https://developer.mozilla.org/en-US/docs/Web/API/Pointer_events#browser_compatibility).\n if (isTouchEnabled) {\n if (isHTMLElement(event.target) || isSVGElement(event.target)) {\n // Тач-события не всплывают, поэтому навешиваем события на целевой элемент\n // см. #235, #1968, https://stackoverflow.com/a/45760014\n const target: HTMLorSVGElementWithEvents = event.target;\n\n target.addEventListener('touchmove', handleNativePointerMove, eventOptions);\n target.addEventListener('touchend', handleNativePointerUp, eventOptions);\n target.addEventListener('touchcancel', handleNativePointerUp, eventOptions);\n\n disposeTargetNativeGestureEvents.current = () => {\n target.removeEventListener('touchmove', handleNativePointerMove, eventOptions);\n target.removeEventListener('touchend', handleNativePointerUp, eventOptions);\n target.removeEventListener('touchcancel', handleNativePointerUp, eventOptions);\n };\n }\n } else {\n // Используем события на Document, т.к. mouse-события на целевом элементе могут теряться при\n // выходе за границы этого элемента.\n const doc = getWindow(event.currentTarget).document;\n\n doc.addEventListener('mousemove', handleNativePointerMove, eventOptions);\n doc.addEventListener('mouseup', handleNativePointerUp, eventOptions);\n doc.addEventListener('mouseleave', handleNativePointerUp, eventOptions);\n\n disposeTargetNativeGestureEvents.current = () => {\n doc.removeEventListener('mousemove', handleNativePointerMove, eventOptions);\n doc.removeEventListener('mouseup', handleNativePointerUp, eventOptions);\n doc.removeEventListener('mouseleave', handleNativePointerUp, eventOptions);\n };\n }\n },\n );\n\n const handlePointerEnter = onEnter\n ? (event: React.MouseEvent<HTMLElement>) => onEnter(event.nativeEvent)\n : undefined;\n\n const handlePointerLeave = onLeave\n ? (event: React.MouseEvent<HTMLElement>) => onLeave(event.nativeEvent)\n : undefined;\n\n /**\n * Отменяет нативное браузерное поведение для вложенных ссылок и изображений.\n */\n const handleDragStart = (event: React.DragEvent<HTMLElement>) => {\n const target = event.target as HTMLElement;\n if (target.tagName === 'A' || target.tagName === 'IMG') {\n event.preventDefault();\n }\n };\n\n /**\n * Отменяет переход по вложенной ссылке, если был зафиксирован свайп.\n */\n const handleClickCapture: typeof onClickCapture = (event) => {\n if (!didSlide.current) {\n return onClickCapture && onClickCapture(event);\n }\n\n if (noSlideClick) {\n event.stopPropagation();\n\n // https://github.com/VKCOM/VKUI/issues/1977\n // https://github.com/VKCOM/VKUI/issues/3892\n event.preventDefault();\n } else {\n onClickCapture && onClickCapture(event);\n }\n\n didSlide.current = false;\n };\n\n useIsomorphicLayoutEffect(\n function initializeNativeTouchStartEventWithPassiveFalse() {\n const hostEl = hostRef.current;\n if (!hostEl || !isTouchEnabled) {\n return;\n }\n\n const options = { capture: useCapture, passive: false };\n hostEl.addEventListener('touchstart', handlePointerDown, options);\n\n return () => {\n hostEl.removeEventListener('touchstart', handlePointerDown, options);\n };\n },\n [hostRef, isTouchEnabled, useCapture, handlePointerDown],\n );\n\n return (\n <Component\n {...restProps}\n ref={hostRef}\n onDragStart={handleDragStart}\n onClickCapture={handleClickCapture}\n // onEnter\n onPointerEnter={usePointerHover ? handlePointerEnter : undefined}\n onMouseEnter={!usePointerHover ? handlePointerEnter : undefined}\n // onLeave\n onPointerLeave={usePointerHover ? handlePointerLeave : undefined}\n onMouseLeave={!usePointerHover ? handlePointerLeave : undefined}\n // handlePointerDown (onTouchStart устанавливается отдельно через initializeNativeTouchEventStartWithPassiveFalse)\n onMouseDownCapture={!isTouchEnabled && useCapture ? handlePointerDown : undefined}\n onMouseDown={!isTouchEnabled && !useCapture ? handlePointerDown : undefined}\n />\n );\n};\n\nfunction initGesture(startX: number, startY: number): Gesture {\n return {\n startX,\n startY,\n startT: new Date(),\n duration: 0,\n isPressed: true,\n isY: false,\n isX: false,\n isSlideX: false,\n isSlideY: false,\n isSlide: false,\n clientX: 0,\n clientY: 0,\n shiftX: 0,\n shiftY: 0,\n shiftXAbs: 0,\n shiftYAbs: 0,\n };\n}\n\ntype Handlers = [\n CustomTouchEventHandler | undefined,\n CustomTouchEventHandler | undefined,\n CustomTouchEventHandler | undefined,\n];\n\nfunction dispatchUserHandlers(\n event: MouseEvent | TouchEvent | React.MouseEvent | React.TouchEvent,\n gesture: Gesture,\n [handler, handlerX, handlerY]: Handlers,\n stopPropagation?: boolean,\n shouldCallDirectionHandlerOnlyIsSlide = true,\n) {\n if (stopPropagation) {\n event.stopPropagation();\n }\n\n const data = {\n ...gesture,\n originalEvent: event as unknown as VKUITouchEvent,\n duration: Date.now() - gesture.startT.getTime(),\n };\n\n if (handler) {\n handler(data);\n }\n\n if (handlerX) {\n if (shouldCallDirectionHandlerOnlyIsSlide) {\n if (gesture.isSlideX) {\n handlerX(data);\n }\n } else {\n handlerX(data);\n }\n }\n\n if (handlerY) {\n if (shouldCallDirectionHandlerOnlyIsSlide) {\n if (gesture.isSlideY) {\n handlerY(data);\n }\n } else {\n handlerY(data);\n }\n }\n}\n"],"names":["React","useExternRef","useStableCallback","getWindow","isHTMLElement","isSVGElement","coordX","coordY","touchEnabled","useIsomorphicLayoutEffect","Touch","onStart","onStartX","onStartY","onMove","onMoveX","onMoveY","onEnter","onLeave","onEnd","onEndX","onEndY","onClickCapture","usePointerHover","slideThreshold","useCapture","Component","getRootRef","noSlideClick","stopPropagation","restProps","hostRef","isTouchEnabled","useState","gestureRef","useRef","didSlide","disposeTargetNativeGestureEvents","cleanupTargetNativeGestureEvents","current","useEffect","handleNativePointerUp","event","gesture","isPressed","dispatchUserHandlers","isSlide","Boolean","handleNativePointerMove","clientX","clientY","shiftX","startX","shiftY","startY","shiftXAbs","Math","abs","shiftYAbs","touches","length","isX","isY","willBeX","willBeY","willBeSlidedX","willBeSlidedY","isSlideX","isSlideY","handlePointerDown","nativeEvent","initGesture","shouldCallDirectionHandlerOnlyIsSlide","eventOptions","capture","passive","target","addEventListener","removeEventListener","doc","currentTarget","document","handlePointerEnter","undefined","handlePointerLeave","handleDragStart","tagName","preventDefault","handleClickCapture","initializeNativeTouchStartEventWithPassiveFalse","hostEl","options","ref","onDragStart","onPointerEnter","onMouseEnter","onPointerLeave","onMouseLeave","onMouseDownCapture","onMouseDown","startT","Date","duration","handler","handlerX","handlerY","data","originalEvent","now","getTime"],"mappings":"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"}