@vkontakte/vkui 7.8.2 → 7.9.1

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 (282) hide show
  1. package/dist/components/Box/Box.d.ts +11 -0
  2. package/dist/components/Box/Box.d.ts.map +1 -0
  3. package/dist/components/Box/Box.js +25 -0
  4. package/dist/components/Box/Box.js.map +1 -0
  5. package/dist/components/CarouselBase/CarouselBase.d.ts +1 -1
  6. package/dist/components/CarouselBase/CarouselBase.d.ts.map +1 -1
  7. package/dist/components/CarouselBase/CarouselBase.js +6 -4
  8. package/dist/components/CarouselBase/CarouselBase.js.map +1 -1
  9. package/dist/components/CarouselBase/constants.d.ts +1 -1
  10. package/dist/components/CarouselBase/constants.d.ts.map +1 -1
  11. package/dist/components/CarouselBase/constants.js +1 -1
  12. package/dist/components/CarouselBase/constants.js.map +1 -1
  13. package/dist/components/CarouselBase/hooks.d.ts +3 -1
  14. package/dist/components/CarouselBase/hooks.d.ts.map +1 -1
  15. package/dist/components/CarouselBase/hooks.js +46 -6
  16. package/dist/components/CarouselBase/hooks.js.map +1 -1
  17. package/dist/components/CarouselBase/types.d.ts +12 -0
  18. package/dist/components/CarouselBase/types.d.ts.map +1 -1
  19. package/dist/components/CarouselBase/types.js.map +1 -1
  20. package/dist/components/Checkbox/Checkbox.d.ts +11 -2
  21. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
  22. package/dist/components/Checkbox/Checkbox.js +44 -10
  23. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  24. package/dist/components/Checkbox/CheckboxInput/CheckboxInput.d.ts +16 -3
  25. package/dist/components/Checkbox/CheckboxInput/CheckboxInput.d.ts.map +1 -1
  26. package/dist/components/Checkbox/CheckboxInput/CheckboxInput.js +32 -19
  27. package/dist/components/Checkbox/CheckboxInput/CheckboxInput.js.map +1 -1
  28. package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.d.ts +1 -1
  29. package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.d.ts.map +1 -1
  30. package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.js +39 -10
  31. package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.js.map +1 -1
  32. package/dist/components/ChipsInput/ChipsInput.d.ts +1 -1
  33. package/dist/components/ChipsInput/ChipsInput.d.ts.map +1 -1
  34. package/dist/components/ChipsInput/ChipsInput.js +32 -13
  35. package/dist/components/ChipsInput/ChipsInput.js.map +1 -1
  36. package/dist/components/ChipsInputBase/ChipsInputBase.d.ts +1 -1
  37. package/dist/components/ChipsInputBase/ChipsInputBase.d.ts.map +1 -1
  38. package/dist/components/ChipsInputBase/ChipsInputBase.js +52 -26
  39. package/dist/components/ChipsInputBase/ChipsInputBase.js.map +1 -1
  40. package/dist/components/ChipsInputBase/types.d.ts +13 -4
  41. package/dist/components/ChipsInputBase/types.d.ts.map +1 -1
  42. package/dist/components/ChipsInputBase/types.js.map +1 -1
  43. package/dist/components/ChipsSelect/ChipsSelect.d.ts +1 -1
  44. package/dist/components/ChipsSelect/ChipsSelect.d.ts.map +1 -1
  45. package/dist/components/ChipsSelect/ChipsSelect.js +67 -38
  46. package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
  47. package/dist/components/CustomSelect/CustomSelect.d.ts +16 -2
  48. package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  49. package/dist/components/CustomSelect/CustomSelect.js +99 -50
  50. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  51. package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.d.ts +6 -2
  52. package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.d.ts.map +1 -1
  53. package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.js +38 -20
  54. package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.js.map +1 -1
  55. package/dist/components/CustomSelect/helpers.d.ts +1 -0
  56. package/dist/components/CustomSelect/helpers.d.ts.map +1 -1
  57. package/dist/components/CustomSelect/helpers.js +11 -0
  58. package/dist/components/CustomSelect/helpers.js.map +1 -1
  59. package/dist/components/Div/Div.d.ts +3 -0
  60. package/dist/components/Div/Div.d.ts.map +1 -1
  61. package/dist/components/Div/Div.js +11 -1
  62. package/dist/components/Div/Div.js.map +1 -1
  63. package/dist/components/File/File.d.ts +16 -3
  64. package/dist/components/File/File.d.ts.map +1 -1
  65. package/dist/components/File/File.js +29 -17
  66. package/dist/components/File/File.js.map +1 -1
  67. package/dist/components/Input/Input.d.ts +16 -3
  68. package/dist/components/Input/Input.d.ts.map +1 -1
  69. package/dist/components/Input/Input.js +28 -13
  70. package/dist/components/Input/Input.js.map +1 -1
  71. package/dist/components/NativeSelect/NativeSelect.d.ts +17 -3
  72. package/dist/components/NativeSelect/NativeSelect.d.ts.map +1 -1
  73. package/dist/components/NativeSelect/NativeSelect.js +37 -14
  74. package/dist/components/NativeSelect/NativeSelect.js.map +1 -1
  75. package/dist/components/Radio/Radio.d.ts +18 -3
  76. package/dist/components/Radio/Radio.d.ts.map +1 -1
  77. package/dist/components/Radio/Radio.js +31 -11
  78. package/dist/components/Radio/Radio.js.map +1 -1
  79. package/dist/components/Radio/RadioInput/RadioInput.d.ts +16 -3
  80. package/dist/components/Radio/RadioInput/RadioInput.d.ts.map +1 -1
  81. package/dist/components/Radio/RadioInput/RadioInput.js +22 -11
  82. package/dist/components/Radio/RadioInput/RadioInput.js.map +1 -1
  83. package/dist/components/Search/Search.d.ts +16 -3
  84. package/dist/components/Search/Search.d.ts.map +1 -1
  85. package/dist/components/Search/Search.js +50 -28
  86. package/dist/components/Search/Search.js.map +1 -1
  87. package/dist/components/Select/Select.d.ts.map +1 -1
  88. package/dist/components/Select/Select.js +10 -4
  89. package/dist/components/Select/Select.js.map +1 -1
  90. package/dist/components/SelectionControl/SelectionControl.d.ts +2 -2
  91. package/dist/components/SelectionControl/SelectionControl.d.ts.map +1 -1
  92. package/dist/components/SelectionControl/SelectionControl.js.map +1 -1
  93. package/dist/components/Snackbar/Snackbar.d.ts +10 -1
  94. package/dist/components/Snackbar/Snackbar.d.ts.map +1 -1
  95. package/dist/components/Snackbar/Snackbar.js +20 -6
  96. package/dist/components/Snackbar/Snackbar.js.map +1 -1
  97. package/dist/components/SplitLayout/SplitLayout.d.ts +16 -3
  98. package/dist/components/SplitLayout/SplitLayout.d.ts.map +1 -1
  99. package/dist/components/SplitLayout/SplitLayout.js +24 -9
  100. package/dist/components/SplitLayout/SplitLayout.js.map +1 -1
  101. package/dist/components/Switch/Switch.d.ts +16 -3
  102. package/dist/components/Switch/Switch.d.ts.map +1 -1
  103. package/dist/components/Switch/Switch.js +32 -20
  104. package/dist/components/Switch/Switch.js.map +1 -1
  105. package/dist/components/Textarea/Textarea.d.ts +16 -3
  106. package/dist/components/Textarea/Textarea.d.ts.map +1 -1
  107. package/dist/components/Textarea/Textarea.js +36 -18
  108. package/dist/components/Textarea/Textarea.js.map +1 -1
  109. package/dist/components/WriteBar/WriteBar.d.ts +16 -3
  110. package/dist/components/WriteBar/WriteBar.d.ts.map +1 -1
  111. package/dist/components/WriteBar/WriteBar.js +28 -11
  112. package/dist/components/WriteBar/WriteBar.js.map +1 -1
  113. package/dist/components.css +1 -1
  114. package/dist/components.css.map +1 -1
  115. package/dist/cssm/components/Box/Box.js +19 -0
  116. package/dist/cssm/components/Box/Box.js.map +1 -0
  117. package/dist/cssm/components/CarouselBase/CarouselBase.js +4 -4
  118. package/dist/cssm/components/CarouselBase/CarouselBase.js.map +1 -1
  119. package/dist/cssm/components/CarouselBase/constants.js +1 -1
  120. package/dist/cssm/components/CarouselBase/constants.js.map +1 -1
  121. package/dist/cssm/components/CarouselBase/hooks.js +46 -6
  122. package/dist/cssm/components/CarouselBase/hooks.js.map +1 -1
  123. package/dist/cssm/components/CarouselBase/types.js.map +1 -1
  124. package/dist/cssm/components/Checkbox/Checkbox.js +29 -6
  125. package/dist/cssm/components/Checkbox/Checkbox.js.map +1 -1
  126. package/dist/cssm/components/Checkbox/CheckboxInput/CheckboxInput.js +24 -13
  127. package/dist/cssm/components/Checkbox/CheckboxInput/CheckboxInput.js.map +1 -1
  128. package/dist/cssm/components/Checkbox/CheckboxSimple/CheckboxSimple.js +24 -6
  129. package/dist/cssm/components/Checkbox/CheckboxSimple/CheckboxSimple.js.map +1 -1
  130. package/dist/cssm/components/ChipsInput/ChipsInput.js +25 -11
  131. package/dist/cssm/components/ChipsInput/ChipsInput.js.map +1 -1
  132. package/dist/cssm/components/ChipsInputBase/ChipsInputBase.js +30 -12
  133. package/dist/cssm/components/ChipsInputBase/ChipsInputBase.js.map +1 -1
  134. package/dist/cssm/components/ChipsInputBase/types.js.map +1 -1
  135. package/dist/cssm/components/ChipsSelect/ChipsSelect.js +49 -30
  136. package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
  137. package/dist/cssm/components/CustomSelect/CustomSelect.js +73 -41
  138. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  139. package/dist/cssm/components/CustomSelect/CustomSelectInput/CustomSelectInput.js +20 -9
  140. package/dist/cssm/components/CustomSelect/CustomSelectInput/CustomSelectInput.js.map +1 -1
  141. package/dist/cssm/components/CustomSelect/helpers.js +11 -0
  142. package/dist/cssm/components/CustomSelect/helpers.js.map +1 -1
  143. package/dist/cssm/components/Div/Div.js +11 -1
  144. package/dist/cssm/components/Div/Div.js.map +1 -1
  145. package/dist/cssm/components/File/File.js +20 -7
  146. package/dist/cssm/components/File/File.js.map +1 -1
  147. package/dist/cssm/components/Input/Input.js +20 -7
  148. package/dist/cssm/components/Input/Input.js.map +1 -1
  149. package/dist/cssm/components/MiniInfoCell/MiniInfoCell.module.css +1 -1
  150. package/dist/cssm/components/NativeSelect/NativeSelect.js +25 -8
  151. package/dist/cssm/components/NativeSelect/NativeSelect.js.map +1 -1
  152. package/dist/cssm/components/Radio/Radio.js +28 -8
  153. package/dist/cssm/components/Radio/Radio.js.map +1 -1
  154. package/dist/cssm/components/Radio/RadioInput/RadioInput.js +18 -6
  155. package/dist/cssm/components/Radio/RadioInput/RadioInput.js.map +1 -1
  156. package/dist/cssm/components/Search/Search.js +34 -17
  157. package/dist/cssm/components/Search/Search.js.map +1 -1
  158. package/dist/cssm/components/Select/Select.js +9 -1
  159. package/dist/cssm/components/Select/Select.js.map +1 -1
  160. package/dist/cssm/components/SelectionControl/SelectionControl.js.map +1 -1
  161. package/dist/cssm/components/Snackbar/Snackbar.js +11 -2
  162. package/dist/cssm/components/Snackbar/Snackbar.js.map +1 -1
  163. package/dist/cssm/components/SplitLayout/SplitLayout.js +22 -8
  164. package/dist/cssm/components/SplitLayout/SplitLayout.js.map +1 -1
  165. package/dist/cssm/components/Switch/Switch.js +29 -17
  166. package/dist/cssm/components/Switch/Switch.js.map +1 -1
  167. package/dist/cssm/components/Textarea/Textarea.js +22 -8
  168. package/dist/cssm/components/Textarea/Textarea.js.map +1 -1
  169. package/dist/cssm/components/WriteBar/WriteBar.js +24 -9
  170. package/dist/cssm/components/WriteBar/WriteBar.js.map +1 -1
  171. package/dist/cssm/hooks/useMergeProps.js +38 -0
  172. package/dist/cssm/hooks/useMergeProps.js.map +1 -0
  173. package/dist/cssm/index.js +2 -0
  174. package/dist/cssm/index.js.map +1 -1
  175. package/dist/cssm/lib/animation/useCSSTransition.js +1 -1
  176. package/dist/cssm/lib/animation/useCSSTransition.js.map +1 -1
  177. package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +1 -1
  178. package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
  179. package/dist/cssm/lib/fx.js +55 -8
  180. package/dist/cssm/lib/fx.js.map +1 -1
  181. package/dist/cssm/lib/layouts/gaps.js.map +1 -1
  182. package/dist/cssm/lib/layouts/helpers.js +21 -0
  183. package/dist/cssm/lib/layouts/helpers.js.map +1 -0
  184. package/dist/cssm/lib/layouts/index.js +1 -0
  185. package/dist/cssm/lib/layouts/index.js.map +1 -1
  186. package/dist/cssm/lib/layouts/layoutProps.js +89 -0
  187. package/dist/cssm/lib/layouts/layoutProps.js.map +1 -0
  188. package/dist/cssm/lib/layouts/resolveLayoutProps.js +36 -0
  189. package/dist/cssm/lib/layouts/resolveLayoutProps.js.map +1 -0
  190. package/dist/cssm/lib/layouts/types.js +3 -0
  191. package/dist/cssm/lib/layouts/types.js.map +1 -0
  192. package/dist/cssm/lib/warnOnce.js +1 -1
  193. package/dist/cssm/lib/warnOnce.js.map +1 -1
  194. package/dist/cssm/styles/layout.css +922 -0
  195. package/dist/hooks/useMergeProps.d.ts +6 -0
  196. package/dist/hooks/useMergeProps.d.ts.map +1 -0
  197. package/dist/hooks/useMergeProps.js +42 -0
  198. package/dist/hooks/useMergeProps.js.map +1 -0
  199. package/dist/index.d.ts +3 -0
  200. package/dist/index.d.ts.map +1 -1
  201. package/dist/index.js +1 -0
  202. package/dist/index.js.map +1 -1
  203. package/dist/lib/animation/useCSSTransition.js +1 -1
  204. package/dist/lib/animation/useCSSTransition.js.map +1 -1
  205. package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +1 -1
  206. package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
  207. package/dist/lib/fx.d.ts +8 -1
  208. package/dist/lib/fx.d.ts.map +1 -1
  209. package/dist/lib/fx.js +55 -8
  210. package/dist/lib/fx.js.map +1 -1
  211. package/dist/lib/layouts/gaps.d.ts +4 -5
  212. package/dist/lib/layouts/gaps.d.ts.map +1 -1
  213. package/dist/lib/layouts/gaps.js.map +1 -1
  214. package/dist/lib/layouts/helpers.d.ts +17 -0
  215. package/dist/lib/layouts/helpers.d.ts.map +1 -0
  216. package/dist/lib/layouts/helpers.js +21 -0
  217. package/dist/lib/layouts/helpers.js.map +1 -0
  218. package/dist/lib/layouts/index.d.ts +2 -0
  219. package/dist/lib/layouts/index.d.ts.map +1 -1
  220. package/dist/lib/layouts/index.js +1 -0
  221. package/dist/lib/layouts/index.js.map +1 -1
  222. package/dist/lib/layouts/layoutProps.d.ts +33 -0
  223. package/dist/lib/layouts/layoutProps.d.ts.map +1 -0
  224. package/dist/lib/layouts/layoutProps.js +89 -0
  225. package/dist/lib/layouts/layoutProps.js.map +1 -0
  226. package/dist/lib/layouts/resolveLayoutProps.d.ts +18 -0
  227. package/dist/lib/layouts/resolveLayoutProps.d.ts.map +1 -0
  228. package/dist/lib/layouts/resolveLayoutProps.js +35 -0
  229. package/dist/lib/layouts/resolveLayoutProps.js.map +1 -0
  230. package/dist/lib/layouts/types.d.ts +123 -0
  231. package/dist/lib/layouts/types.d.ts.map +1 -0
  232. package/dist/lib/layouts/types.js +3 -0
  233. package/dist/lib/layouts/types.js.map +1 -0
  234. package/dist/lib/warnOnce.js +1 -1
  235. package/dist/lib/warnOnce.js.map +1 -1
  236. package/dist/vkui.css +1 -1
  237. package/dist/vkui.css.map +1 -1
  238. package/package.json +2 -2
  239. package/src/components/Box/Box.tsx +26 -0
  240. package/src/components/CarouselBase/CarouselBase.tsx +11 -4
  241. package/src/components/CarouselBase/constants.ts +1 -1
  242. package/src/components/CarouselBase/hooks.ts +31 -6
  243. package/src/components/CarouselBase/types.ts +13 -0
  244. package/src/components/Checkbox/Checkbox.tsx +57 -7
  245. package/src/components/Checkbox/CheckboxInput/CheckboxInput.tsx +51 -18
  246. package/src/components/Checkbox/CheckboxSimple/CheckboxSimple.tsx +36 -6
  247. package/src/components/ChipsInput/ChipsInput.tsx +38 -11
  248. package/src/components/ChipsInputBase/ChipsInputBase.tsx +60 -17
  249. package/src/components/ChipsInputBase/types.ts +15 -4
  250. package/src/components/ChipsSelect/ChipsSelect.tsx +71 -33
  251. package/src/components/CustomSelect/CustomSelect.tsx +135 -45
  252. package/src/components/CustomSelect/CustomSelectInput/CustomSelectInput.tsx +48 -17
  253. package/src/components/CustomSelect/helpers.ts +23 -0
  254. package/src/components/Div/Div.tsx +13 -3
  255. package/src/components/File/File.tsx +48 -11
  256. package/src/components/Input/Input.tsx +51 -14
  257. package/src/components/MiniInfoCell/MiniInfoCell.module.css +1 -1
  258. package/src/components/NativeSelect/NativeSelect.tsx +57 -18
  259. package/src/components/Radio/Radio.tsx +51 -8
  260. package/src/components/Radio/RadioInput/RadioInput.tsx +35 -11
  261. package/src/components/Search/Search.tsx +80 -29
  262. package/src/components/Select/Select.tsx +22 -3
  263. package/src/components/SelectionControl/SelectionControl.tsx +2 -1
  264. package/src/components/Snackbar/Snackbar.tsx +35 -5
  265. package/src/components/SplitLayout/SplitLayout.tsx +46 -12
  266. package/src/components/Switch/Switch.tsx +62 -31
  267. package/src/components/Textarea/Textarea.tsx +58 -14
  268. package/src/components/WriteBar/WriteBar.tsx +59 -13
  269. package/src/hooks/useMergeProps.ts +66 -0
  270. package/src/index.ts +3 -0
  271. package/src/lib/animation/useCSSTransition.ts +1 -1
  272. package/src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts +1 -1
  273. package/src/lib/fx.ts +63 -8
  274. package/src/lib/layouts/gaps.ts +4 -5
  275. package/src/lib/layouts/helpers.ts +24 -0
  276. package/src/lib/layouts/index.ts +13 -0
  277. package/src/lib/layouts/layoutProps.ts +75 -0
  278. package/src/lib/layouts/resolveLayoutProps.ts +51 -0
  279. package/src/lib/layouts/types.ts +142 -0
  280. package/src/lib/warnOnce.ts +1 -1
  281. package/src/styles/layout.css +1 -0
  282. package/src/styles/layout.css.d.ts.map +1 -0
@@ -5,12 +5,15 @@ import { classNames } from '@vkontakte/vkjs';
5
5
  import { isHTMLElement } from '@vkontakte/vkui-floating-ui/utils/dom';
6
6
  import { useAdaptivity } from '../../hooks/useAdaptivity';
7
7
  import { useExternRef } from '../../hooks/useExternRef';
8
+ import { useMergeProps } from '../../hooks/useMergeProps';
8
9
  import { getHorizontalFocusGoTo, Keys } from '../../lib/accessibility';
10
+ import { callMultiple } from '../../lib/callMultiple';
9
11
  import {
10
12
  contains as checkTargetIsInputEl,
11
13
  contains,
12
14
  getActiveElementByAnotherElement,
13
15
  } from '../../lib/dom';
16
+ import { warnOnce } from '../../lib/warnOnce';
14
17
  import { FormField } from '../FormField/FormField';
15
18
  import { FormFieldClearButton } from '../FormFieldClearButton/FormFieldClearButton';
16
19
  import { Text } from '../Typography/Text/Text';
@@ -25,6 +28,8 @@ import {
25
28
  import type { ChipOption, ChipOptionValue, ChipsInputBasePrivateProps, NavigateTo } from './types';
26
29
  import styles from './ChipsInputBase.module.css';
27
30
 
31
+ const warn = warnOnce('ChipsInputBase');
32
+
28
33
  const sizeYClassNames = {
29
34
  none: styles.sizeYNone,
30
35
  compact: styles.sizeYCompact,
@@ -32,9 +37,9 @@ const sizeYClassNames = {
32
37
 
33
38
  export const ChipsInputBase = <O extends ChipOption>({
34
39
  // FormFieldProps
35
- getRootRef,
36
- style,
37
- className,
40
+ 'getRootRef': rootGetRootRef,
41
+ 'style': rootStyle,
42
+ 'className': rootClassName,
38
43
  before,
39
44
  after,
40
45
  status,
@@ -49,13 +54,8 @@ export const ChipsInputBase = <O extends ChipOption>({
49
54
 
50
55
  // input
51
56
  getRef,
52
- 'id': idProp,
53
- inputValue = DEFAULT_INPUT_VALUE,
54
- placeholder,
55
- disabled,
56
- readOnly,
57
+ 'inputValue': inputValueProp = DEFAULT_INPUT_VALUE,
57
58
  addOnBlur,
58
- onBlur,
59
59
  onInputChange,
60
60
 
61
61
  // clear
@@ -67,11 +67,55 @@ export const ChipsInputBase = <O extends ChipOption>({
67
67
  // a11y
68
68
  chipsListLabel = 'Выбранные элементы',
69
69
  'aria-label': ariaLabel = '',
70
+
71
+ slotProps,
70
72
  ...restProps
71
73
  }: ChipsInputBasePrivateProps<O>): React.ReactNode => {
72
74
  const { sizeY = 'none' } = useAdaptivity();
75
+
76
+ /* istanbul ignore if: не проверяем в тестах */
77
+ if (process.env.NODE_ENV === 'development' && getRef) {
78
+ warn('Свойство `getRef` устаревшее, используйте `slotProps={ input: { getRootRef: ... } }`');
79
+ }
80
+
81
+ const {
82
+ className,
83
+ style,
84
+ getRootRef,
85
+ onClick: onRootClick,
86
+ onMouseDown: onRootMouseDown,
87
+ ...rootRest
88
+ } = useMergeProps(
89
+ {
90
+ getRootRef: rootGetRootRef,
91
+ style: rootStyle,
92
+ className: rootClassName,
93
+ },
94
+ slotProps?.root,
95
+ );
96
+
97
+ const {
98
+ getRootRef: getInputRef,
99
+ onBlur,
100
+ placeholder,
101
+ readOnly,
102
+ disabled,
103
+ id,
104
+ value: inputValue = DEFAULT_INPUT_VALUE,
105
+ ...inputRest
106
+ } = useMergeProps(
107
+ {
108
+ getRootRef: getRef,
109
+ className: styles.el,
110
+ value: inputValueProp,
111
+ onChange: onInputChange,
112
+ ...restProps,
113
+ },
114
+ slotProps?.input,
115
+ );
116
+
73
117
  const idGenerated = React.useId();
74
- const inputRef = useExternRef(getRef);
118
+ const inputRef = useExternRef(getInputRef);
75
119
  const containerRef = React.useRef<HTMLDivElement>(null);
76
120
  const listboxRef = React.useRef<HTMLDivElement>(null);
77
121
 
@@ -232,7 +276,7 @@ export const ChipsInputBase = <O extends ChipOption>({
232
276
  return undefined;
233
277
  }, [after, clearButton]);
234
278
 
235
- const inputId = idProp || `chips-input-base-generated-id-${idGenerated}`;
279
+ const inputId = id || `chips-input-base-generated-id-${idGenerated}`;
236
280
 
237
281
  const handleRootMouseDown = (e: React.MouseEvent<HTMLDivElement>) => {
238
282
  // Если клик был в один из чипов, то preventDefault делать не нужно, так как не будет срабатывать выделение текста
@@ -273,8 +317,9 @@ export const ChipsInputBase = <O extends ChipOption>({
273
317
  mode={mode}
274
318
  className={className}
275
319
  maxHeight={maxHeight}
276
- onClick={disabled ? undefined : handleRootClick}
277
- onMouseDown={handleRootMouseDown}
320
+ onClick={disabled ? onRootClick : callMultiple(handleRootClick, onRootClick)}
321
+ onMouseDown={callMultiple(handleRootMouseDown, onRootMouseDown)}
322
+ {...rootRest}
278
323
  >
279
324
  <div
280
325
  className={classNames(
@@ -329,19 +374,17 @@ export const ChipsInputBase = <O extends ChipOption>({
329
374
  autoComplete="off"
330
375
  autoCorrect="off"
331
376
  spellCheck={false}
332
- {...restProps}
333
377
  aria-label={ariaLabel}
334
378
  Component="input"
335
379
  type="text"
336
380
  id={inputId}
337
381
  getRootRef={inputRef}
338
- className={styles.el}
339
382
  disabled={disabled}
340
383
  readOnly={readOnly}
341
- placeholder={withPlaceholder ? placeholder : undefined}
342
384
  value={inputValue}
343
- onChange={onInputChange}
385
+ placeholder={withPlaceholder ? placeholder : undefined}
344
386
  onBlur={handleInputBlur}
387
+ {...inputRest}
345
388
  />
346
389
  </div>
347
390
  </FormField>
@@ -1,5 +1,5 @@
1
1
  import type * as React from 'react';
2
- import type { HasAlign, HasRef } from '../../types';
2
+ import type { HasAlign, HasDataAttribute, HasRootRef } from '../../types';
3
3
  import { type FormFieldProps } from '../FormField/FormField';
4
4
  import { type FormFieldClearButtonProps } from '../FormFieldClearButton/FormFieldClearButton';
5
5
  import { type ChipProps } from './Chip/Chip';
@@ -119,12 +119,23 @@ export interface ChipsInputBaseProps<O extends ChipOption = ChipOption>
119
119
  React.InputHTMLAttributes<HTMLInputElement>,
120
120
  keyof UseChipsInputBaseProps<O> | 'defaultChecked'
121
121
  >,
122
- HasRef<HTMLInputElement>,
122
+ HasRootRef<HTMLDivElement>,
123
123
  HasAlign {
124
124
  /**
125
- * Ссылка на корневой элемент.
125
+ * @deprecated Since 7.9.0. Вместо этого используйте `slotProps={ input: { getRootRef: ... } }`.
126
126
  */
127
- getRootRef?: React.Ref<HTMLDivElement>;
127
+ getRef?: React.Ref<HTMLInputElement>;
128
+ /**
129
+ * Свойства, которые можно прокинуть внутрь компонента:
130
+ * - `root`: свойства для прокидывания в корень компонента;
131
+ * - `input`: свойства для прокидывания в поле ввода.
132
+ */
133
+ slotProps?: {
134
+ root?: React.HTMLAttributes<HTMLDivElement> & HasRootRef<HTMLDivElement> & HasDataAttribute;
135
+ input?: React.InputHTMLAttributes<HTMLInputElement> &
136
+ HasRootRef<HTMLInputElement> &
137
+ HasDataAttribute;
138
+ };
128
139
  /**
129
140
  * Добавляет значение в список на событие `onBlur`.
130
141
  */
@@ -5,6 +5,7 @@ import { type MouseEventHandler } from 'react';
5
5
  import { classNames } from '@vkontakte/vkjs';
6
6
  import { useExternRef } from '../../hooks/useExternRef';
7
7
  import { useGlobalOnEventOutside } from '../../hooks/useGlobalOnClickOutside';
8
+ import { useMergeProps } from '../../hooks/useMergeProps';
8
9
  import { Keys } from '../../lib/accessibility';
9
10
  import type { Placement } from '../../lib/floating';
10
11
  import { defaultFilterFn } from '../../lib/select';
@@ -147,7 +148,6 @@ export interface ChipsSelectProps<O extends ChipOption>
147
148
  */
148
149
  export const ChipsSelect = <Option extends ChipOption>({
149
150
  // FormFieldProps
150
- id: labelledbyId,
151
151
  getRootRef,
152
152
  className,
153
153
  status = 'default',
@@ -178,19 +178,14 @@ export const ChipsSelect = <Option extends ChipOption>({
178
178
  value: valueProp,
179
179
  defaultValue,
180
180
  inputValue: inputValueProp,
181
- defaultInputValue,
182
- disabled,
183
- readOnly,
181
+ defaultInputValue: defaultInputValueProp,
184
182
  getOptionValue = getOptionValueDefault,
185
183
  getOptionLabel = getOptionLabelDefault,
186
184
  getNewOptionData = getNewOptionDataDefault,
187
185
  renderChip = renderChipDefault,
188
186
  renderOption = renderOptionDefault,
189
187
  onChange,
190
- onFocus: onFocusProp,
191
188
  onInputChange: onInputChangeProp,
192
- onBlur: onBlurProp,
193
- onKeyDown: onKeyDownProp,
194
189
  dropdownOffsetDistance = 0,
195
190
  allowClearButton,
196
191
  clearButtonTestId,
@@ -198,8 +193,46 @@ export const ChipsSelect = <Option extends ChipOption>({
198
193
 
199
194
  // a11y
200
195
  chipsListLabel,
196
+
197
+ // input native props
198
+ disabled: disabledProp,
199
+ readOnly: readOnlyProp,
200
+ id: idProp,
201
+ onFocus: onFocusProp,
202
+ onBlur: onBlurProp,
203
+ onKeyDown: onKeyDownProp,
204
+
205
+ slotProps,
201
206
  ...restProps
202
207
  }: ChipsSelectProps<Option>): React.ReactNode => {
208
+ const {
209
+ getRootRef: getInputRef,
210
+ value: resolvedInputValue,
211
+ defaultValue: resolvedDefaultInputValue,
212
+ onChange: resolvedOnInputChange,
213
+ disabled,
214
+ readOnly,
215
+ id: labelledbyId,
216
+ onFocus,
217
+ onBlur,
218
+ onKeyDown,
219
+ ...inputRest
220
+ } = useMergeProps(
221
+ {
222
+ getRootRef: getRef,
223
+ value: inputValueProp,
224
+ defaultValue: defaultInputValueProp,
225
+ onChange: onInputChangeProp,
226
+ disabled: disabledProp,
227
+ readOnly: readOnlyProp,
228
+ id: idProp,
229
+ onFocus: onFocusProp,
230
+ onBlur: onBlurProp,
231
+ onKeyDown: onKeyDownProp,
232
+ },
233
+ slotProps?.input,
234
+ );
235
+
203
236
  const {
204
237
  // Связано с ChipsInputProps
205
238
  // option
@@ -232,9 +265,9 @@ export const ChipsSelect = <Option extends ChipOption>({
232
265
  getNewOptionData,
233
266
 
234
267
  // input
235
- inputValue: inputValueProp,
236
- defaultInputValue,
237
- onInputChange: onInputChangeProp,
268
+ inputValue: resolvedInputValue as string,
269
+ defaultInputValue: resolvedDefaultInputValue as string,
270
+ onInputChange: resolvedOnInputChange,
238
271
 
239
272
  // dropdown
240
273
  options: optionsProp,
@@ -253,7 +286,7 @@ export const ChipsSelect = <Option extends ChipOption>({
253
286
 
254
287
  // Связано с ChipsInputProps
255
288
  const rootRef = useExternRef(getRootRef);
256
- const inputRef = useExternRef(getRef, inputRefHook);
289
+ const inputRef = useExternRef(getInputRef, inputRefHook);
257
290
 
258
291
  // Связано с CustomSelectDropdownProps
259
292
  const [dropdownVerticalPlacement, setDropdownVerticalPlacement] = React.useState<
@@ -274,8 +307,8 @@ export const ChipsSelect = <Option extends ChipOption>({
274
307
  const dropdownScrollBoxRef = React.useRef<HTMLDivElement>(null);
275
308
 
276
309
  const handleFocus = (event: React.FocusEvent<HTMLInputElement>) => {
277
- if (onFocusProp) {
278
- onFocusProp(event);
310
+ if (onFocus) {
311
+ onFocus(event);
279
312
  }
280
313
 
281
314
  if (!readOnly) {
@@ -285,8 +318,8 @@ export const ChipsSelect = <Option extends ChipOption>({
285
318
  };
286
319
 
287
320
  const handleBlur = (event: React.FocusEvent<HTMLInputElement>) => {
288
- if (onBlurProp) {
289
- onBlurProp(event);
321
+ if (onBlur) {
322
+ onBlur(event);
290
323
  }
291
324
 
292
325
  // Не добавляем значение, если его нужно выбрать строго из списка
@@ -352,8 +385,8 @@ export const ChipsSelect = <Option extends ChipOption>({
352
385
  };
353
386
 
354
387
  const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {
355
- if (onKeyDownProp) {
356
- onKeyDownProp(event);
388
+ if (onKeyDown) {
389
+ onKeyDown(event);
357
390
  }
358
391
 
359
392
  if (event.defaultPrevented || readOnly) {
@@ -554,13 +587,9 @@ export const ChipsSelect = <Option extends ChipOption>({
554
587
  return (
555
588
  <>
556
589
  <ChipsInputBase
557
- {...restProps}
558
- disabled={disabled}
559
- readOnly={readOnly}
560
590
  clearButtonShown={clearButtonShown}
561
591
  clearButtonTestId={clearButtonTestId}
562
592
  // FormFieldProps
563
- id={labelledbyId}
564
593
  getRootRef={rootRef}
565
594
  className={classNames(styles.host, openedClassNames, className)}
566
595
  status={status}
@@ -582,20 +611,29 @@ export const ChipsSelect = <Option extends ChipOption>({
582
611
  onRemoveChipOption={removeOption}
583
612
  renderChip={renderChip}
584
613
  onClear={clearOptions}
585
- // input
586
- getRef={inputRef}
587
- inputValue={inputValue}
588
- onInputChange={onInputChange}
589
- onFocus={handleFocus}
590
- onBlur={handleBlur}
591
- onKeyDown={handleKeyDown}
592
614
  // a11y
593
- role="combobox"
594
- aria-expanded={opened}
595
- aria-autocomplete="list"
596
- aria-activedescendant={opened ? dropdownCurrentItemId : undefined}
597
- aria-haspopup="listbox"
598
615
  chipsListLabel={chipsListLabel}
616
+ slotProps={{
617
+ ...slotProps,
618
+ input: {
619
+ 'role': 'combobox',
620
+ 'aria-expanded': opened,
621
+ 'aria-autocomplete': 'list',
622
+ 'aria-activedescendant': opened ? dropdownCurrentItemId : undefined,
623
+ 'aria-haspopup': 'listbox',
624
+ 'getRootRef': inputRef,
625
+ 'value': inputValue,
626
+ 'onChange': onInputChange,
627
+ disabled,
628
+ readOnly,
629
+ 'id': labelledbyId,
630
+ 'onFocus': handleFocus,
631
+ 'onBlur': handleBlur,
632
+ 'onKeyDown': handleKeyDown,
633
+ ...inputRest,
634
+ },
635
+ }}
636
+ {...restProps}
599
637
  />
600
638
  {opened && (
601
639
  <CustomSelectDropdown