@vkontakte/vkui 6.5.0 → 6.5.2

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 (334) hide show
  1. package/dist/cjs/components/Button/Button.js +1 -1
  2. package/dist/cjs/components/Button/Button.js.map +1 -1
  3. package/dist/cjs/components/Cell/Cell.d.ts.map +1 -1
  4. package/dist/cjs/components/Cell/Cell.js +10 -14
  5. package/dist/cjs/components/Cell/Cell.js.map +1 -1
  6. package/dist/cjs/components/ChipsInputBase/Chip/Chip.js +2 -2
  7. package/dist/cjs/components/ChipsInputBase/Chip/Chip.js.map +1 -1
  8. package/dist/cjs/components/ChipsSelect/ChipsSelect.js +9 -9
  9. package/dist/cjs/components/ChipsSelect/ChipsSelect.js.map +1 -1
  10. package/dist/cjs/components/Clickable/Clickable.d.ts.map +1 -1
  11. package/dist/cjs/components/Clickable/Clickable.js +1 -1
  12. package/dist/cjs/components/Clickable/Clickable.js.map +1 -1
  13. package/dist/cjs/components/CustomSelect/CustomSelect.d.ts +3 -13
  14. package/dist/cjs/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  15. package/dist/cjs/components/CustomSelect/CustomSelect.js +45 -70
  16. package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
  17. package/dist/cjs/components/CustomSelect/CustomSelectInput.d.ts +4 -2
  18. package/dist/cjs/components/CustomSelect/CustomSelectInput.d.ts.map +1 -1
  19. package/dist/cjs/components/CustomSelect/CustomSelectInput.js +19 -24
  20. package/dist/cjs/components/CustomSelect/CustomSelectInput.js.map +1 -1
  21. package/dist/cjs/components/CustomSelect/helpers.d.ts +8 -0
  22. package/dist/cjs/components/CustomSelect/helpers.d.ts.map +1 -0
  23. package/dist/cjs/components/CustomSelect/helpers.js +76 -0
  24. package/dist/cjs/components/CustomSelect/helpers.js.map +1 -0
  25. package/dist/cjs/components/CustomSelect/types.d.ts +12 -0
  26. package/dist/cjs/components/CustomSelect/types.d.ts.map +1 -0
  27. package/dist/cjs/components/CustomSelect/types.js +6 -0
  28. package/dist/cjs/components/CustomSelect/types.js.map +1 -0
  29. package/dist/cjs/components/CustomSelectDropdown/CustomSelectDropdown.d.ts +1 -1
  30. package/dist/cjs/components/CustomSelectDropdown/CustomSelectDropdown.d.ts.map +1 -1
  31. package/dist/cjs/components/CustomSelectDropdown/CustomSelectDropdown.js +2 -14
  32. package/dist/cjs/components/CustomSelectDropdown/CustomSelectDropdown.js.map +1 -1
  33. package/dist/cjs/components/DateInput/DateInput.d.ts +1 -1
  34. package/dist/cjs/components/DateInput/DateInput.d.ts.map +1 -1
  35. package/dist/cjs/components/DateInput/DateInput.js.map +1 -1
  36. package/dist/cjs/components/DateRangeInput/DateRangeInput.d.ts +1 -1
  37. package/dist/cjs/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  38. package/dist/cjs/components/DateRangeInput/DateRangeInput.js.map +1 -1
  39. package/dist/cjs/components/Flex/FlexItem/FlexItem.d.ts +6 -4
  40. package/dist/cjs/components/Flex/FlexItem/FlexItem.d.ts.map +1 -1
  41. package/dist/cjs/components/Flex/FlexItem/FlexItem.js.map +1 -1
  42. package/dist/cjs/components/Footer/Footer.d.ts +1 -1
  43. package/dist/cjs/components/Footer/Footer.d.ts.map +1 -1
  44. package/dist/cjs/components/Footer/Footer.js +7 -3
  45. package/dist/cjs/components/Footer/Footer.js.map +1 -1
  46. package/dist/cjs/components/FormItem/FormItem.js +2 -2
  47. package/dist/cjs/components/FormItem/FormItem.js.map +1 -1
  48. package/dist/cjs/components/FormLayoutGroup/FormLayoutGroup.d.ts.map +1 -1
  49. package/dist/cjs/components/FormLayoutGroup/FormLayoutGroup.js +3 -3
  50. package/dist/cjs/components/FormLayoutGroup/FormLayoutGroup.js.map +1 -1
  51. package/dist/cjs/components/Group/Group.d.ts.map +1 -1
  52. package/dist/cjs/components/Group/Group.js +3 -2
  53. package/dist/cjs/components/Group/Group.js.map +1 -1
  54. package/dist/cjs/components/Link/Link.d.ts +1 -1
  55. package/dist/cjs/components/Link/Link.d.ts.map +1 -1
  56. package/dist/cjs/components/Link/Link.js +3 -5
  57. package/dist/cjs/components/Link/Link.js.map +1 -1
  58. package/dist/cjs/components/Removable/Removable.d.ts +5 -1
  59. package/dist/cjs/components/Removable/Removable.d.ts.map +1 -1
  60. package/dist/cjs/components/Removable/Removable.js +8 -5
  61. package/dist/cjs/components/Removable/Removable.js.map +1 -1
  62. package/dist/cjs/components/RootComponent/RootComponent.d.ts +1 -1
  63. package/dist/cjs/components/RootComponent/RootComponent.d.ts.map +1 -1
  64. package/dist/cjs/components/RootComponent/RootComponent.js +1 -1
  65. package/dist/cjs/components/RootComponent/RootComponent.js.map +1 -1
  66. package/dist/cjs/components/Search/Search.d.ts.map +1 -1
  67. package/dist/cjs/components/Search/Search.js +3 -2
  68. package/dist/cjs/components/Search/Search.js.map +1 -1
  69. package/dist/cjs/components/Select/Select.d.ts.map +1 -1
  70. package/dist/cjs/components/Select/Select.js +1 -2
  71. package/dist/cjs/components/Select/Select.js.map +1 -1
  72. package/dist/cjs/components/SelectTypography/SelectTypography.d.ts +2 -2
  73. package/dist/cjs/components/SelectTypography/SelectTypography.d.ts.map +1 -1
  74. package/dist/cjs/components/SelectTypography/SelectTypography.js.map +1 -1
  75. package/dist/cjs/components/SimpleCell/SimpleCell.d.ts +1 -1
  76. package/dist/cjs/components/SimpleCell/SimpleCell.d.ts.map +1 -1
  77. package/dist/cjs/components/SimpleCell/SimpleCell.js +1 -1
  78. package/dist/cjs/components/SimpleCell/SimpleCell.js.map +1 -1
  79. package/dist/cjs/components/Snackbar/Snackbar.js +2 -2
  80. package/dist/cjs/components/Snackbar/Snackbar.js.map +1 -1
  81. package/dist/cjs/components/ToolButton/ToolButton.d.ts +1 -1
  82. package/dist/cjs/components/ToolButton/ToolButton.d.ts.map +1 -1
  83. package/dist/cjs/components/ToolButton/ToolButton.js +1 -3
  84. package/dist/cjs/components/ToolButton/ToolButton.js.map +1 -1
  85. package/dist/cjs/components/View/View.d.ts.map +1 -1
  86. package/dist/cjs/components/View/View.js +16 -32
  87. package/dist/cjs/components/View/View.js.map +1 -1
  88. package/dist/cjs/hooks/useEnsuredControl.d.ts.map +1 -1
  89. package/dist/cjs/hooks/useEnsuredControl.js +27 -3
  90. package/dist/cjs/hooks/useEnsuredControl.js.map +1 -1
  91. package/dist/cjs/hooks/useIsClient.d.ts +1 -1
  92. package/dist/cjs/hooks/useIsClient.js.map +1 -1
  93. package/dist/cjs/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
  94. package/dist/components/Button/Button.js +2 -2
  95. package/dist/components/Button/Button.js.map +1 -1
  96. package/dist/components/Cell/Cell.d.ts.map +1 -1
  97. package/dist/components/Cell/Cell.js +11 -15
  98. package/dist/components/Cell/Cell.js.map +1 -1
  99. package/dist/components/ChipsInputBase/Chip/Chip.js +3 -3
  100. package/dist/components/ChipsInputBase/Chip/Chip.js.map +1 -1
  101. package/dist/components/ChipsSelect/ChipsSelect.js +9 -9
  102. package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
  103. package/dist/components/Clickable/Clickable.d.ts.map +1 -1
  104. package/dist/components/Clickable/Clickable.js +1 -1
  105. package/dist/components/Clickable/Clickable.js.map +1 -1
  106. package/dist/components/CustomSelect/CustomSelect.d.ts +3 -13
  107. package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  108. package/dist/components/CustomSelect/CustomSelect.js +37 -62
  109. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  110. package/dist/components/CustomSelect/CustomSelectInput.d.ts +4 -2
  111. package/dist/components/CustomSelect/CustomSelectInput.d.ts.map +1 -1
  112. package/dist/components/CustomSelect/CustomSelectInput.js +19 -24
  113. package/dist/components/CustomSelect/CustomSelectInput.js.map +1 -1
  114. package/dist/components/CustomSelect/helpers.d.ts +8 -0
  115. package/dist/components/CustomSelect/helpers.d.ts.map +1 -0
  116. package/dist/components/CustomSelect/helpers.js +48 -0
  117. package/dist/components/CustomSelect/helpers.js.map +1 -0
  118. package/dist/components/CustomSelect/types.d.ts +12 -0
  119. package/dist/components/CustomSelect/types.d.ts.map +1 -0
  120. package/dist/components/CustomSelect/types.js +3 -0
  121. package/dist/components/CustomSelect/types.js.map +1 -0
  122. package/dist/components/CustomSelectDropdown/CustomSelectDropdown.d.ts +1 -1
  123. package/dist/components/CustomSelectDropdown/CustomSelectDropdown.d.ts.map +1 -1
  124. package/dist/components/CustomSelectDropdown/CustomSelectDropdown.js +2 -14
  125. package/dist/components/CustomSelectDropdown/CustomSelectDropdown.js.map +1 -1
  126. package/dist/components/DateInput/DateInput.d.ts +1 -1
  127. package/dist/components/DateInput/DateInput.d.ts.map +1 -1
  128. package/dist/components/DateInput/DateInput.js.map +1 -1
  129. package/dist/components/DateRangeInput/DateRangeInput.d.ts +1 -1
  130. package/dist/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  131. package/dist/components/DateRangeInput/DateRangeInput.js.map +1 -1
  132. package/dist/components/Flex/FlexItem/FlexItem.d.ts +6 -4
  133. package/dist/components/Flex/FlexItem/FlexItem.d.ts.map +1 -1
  134. package/dist/components/Flex/FlexItem/FlexItem.js.map +1 -1
  135. package/dist/components/Footer/Footer.d.ts +1 -1
  136. package/dist/components/Footer/Footer.d.ts.map +1 -1
  137. package/dist/components/Footer/Footer.js +7 -3
  138. package/dist/components/Footer/Footer.js.map +1 -1
  139. package/dist/components/FormItem/FormItem.js +3 -3
  140. package/dist/components/FormItem/FormItem.js.map +1 -1
  141. package/dist/components/FormLayoutGroup/FormLayoutGroup.d.ts.map +1 -1
  142. package/dist/components/FormLayoutGroup/FormLayoutGroup.js +4 -4
  143. package/dist/components/FormLayoutGroup/FormLayoutGroup.js.map +1 -1
  144. package/dist/components/Group/Group.d.ts.map +1 -1
  145. package/dist/components/Group/Group.js +3 -2
  146. package/dist/components/Group/Group.js.map +1 -1
  147. package/dist/components/Link/Link.d.ts +1 -1
  148. package/dist/components/Link/Link.d.ts.map +1 -1
  149. package/dist/components/Link/Link.js +4 -6
  150. package/dist/components/Link/Link.js.map +1 -1
  151. package/dist/components/Removable/Removable.d.ts +5 -1
  152. package/dist/components/Removable/Removable.d.ts.map +1 -1
  153. package/dist/components/Removable/Removable.js +9 -6
  154. package/dist/components/Removable/Removable.js.map +1 -1
  155. package/dist/components/RootComponent/RootComponent.d.ts +1 -1
  156. package/dist/components/RootComponent/RootComponent.d.ts.map +1 -1
  157. package/dist/components/RootComponent/RootComponent.js +1 -1
  158. package/dist/components/RootComponent/RootComponent.js.map +1 -1
  159. package/dist/components/Search/Search.d.ts.map +1 -1
  160. package/dist/components/Search/Search.js +3 -2
  161. package/dist/components/Search/Search.js.map +1 -1
  162. package/dist/components/Select/Select.d.ts.map +1 -1
  163. package/dist/components/Select/Select.js +1 -2
  164. package/dist/components/Select/Select.js.map +1 -1
  165. package/dist/components/SelectTypography/SelectTypography.d.ts +2 -2
  166. package/dist/components/SelectTypography/SelectTypography.d.ts.map +1 -1
  167. package/dist/components/SelectTypography/SelectTypography.js.map +1 -1
  168. package/dist/components/SimpleCell/SimpleCell.d.ts +1 -1
  169. package/dist/components/SimpleCell/SimpleCell.d.ts.map +1 -1
  170. package/dist/components/SimpleCell/SimpleCell.js +1 -1
  171. package/dist/components/SimpleCell/SimpleCell.js.map +1 -1
  172. package/dist/components/Snackbar/Snackbar.js +3 -3
  173. package/dist/components/Snackbar/Snackbar.js.map +1 -1
  174. package/dist/components/ToolButton/ToolButton.d.ts +1 -1
  175. package/dist/components/ToolButton/ToolButton.d.ts.map +1 -1
  176. package/dist/components/ToolButton/ToolButton.js +2 -4
  177. package/dist/components/ToolButton/ToolButton.js.map +1 -1
  178. package/dist/components/View/View.d.ts.map +1 -1
  179. package/dist/components/View/View.js +17 -33
  180. package/dist/components/View/View.js.map +1 -1
  181. package/dist/components.css +3 -3
  182. package/dist/components.css.map +1 -1
  183. package/dist/components.js.tmp +260 -263
  184. package/dist/cssm/components/Button/Button.js +2 -2
  185. package/dist/cssm/components/Button/Button.js.map +1 -1
  186. package/dist/cssm/components/Cell/Cell.d.ts.map +1 -1
  187. package/dist/cssm/components/Cell/Cell.js +11 -14
  188. package/dist/cssm/components/Cell/Cell.js.map +1 -1
  189. package/dist/cssm/components/Cell/Cell.module.css +0 -4
  190. package/dist/cssm/components/ChipsInputBase/Chip/Chip.js +3 -3
  191. package/dist/cssm/components/ChipsInputBase/Chip/Chip.js.map +1 -1
  192. package/dist/cssm/components/ChipsSelect/ChipsSelect.js +9 -9
  193. package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
  194. package/dist/cssm/components/Clickable/Clickable.d.ts.map +1 -1
  195. package/dist/cssm/components/Clickable/Clickable.js +1 -1
  196. package/dist/cssm/components/Clickable/Clickable.js.map +1 -1
  197. package/dist/cssm/components/CustomSelect/CustomSelect.d.ts +3 -13
  198. package/dist/cssm/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  199. package/dist/cssm/components/CustomSelect/CustomSelect.js +36 -59
  200. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  201. package/dist/cssm/components/CustomSelect/CustomSelectInput.d.ts +4 -2
  202. package/dist/cssm/components/CustomSelect/CustomSelectInput.d.ts.map +1 -1
  203. package/dist/cssm/components/CustomSelect/CustomSelectInput.js +16 -21
  204. package/dist/cssm/components/CustomSelect/CustomSelectInput.js.map +1 -1
  205. package/dist/cssm/components/CustomSelect/CustomSelectInput.module.css +74 -40
  206. package/dist/cssm/components/CustomSelect/helpers.d.ts +8 -0
  207. package/dist/cssm/components/CustomSelect/helpers.d.ts.map +1 -0
  208. package/dist/cssm/components/CustomSelect/helpers.js +44 -0
  209. package/dist/cssm/components/CustomSelect/helpers.js.map +1 -0
  210. package/dist/cssm/components/CustomSelect/types.d.ts +12 -0
  211. package/dist/cssm/components/CustomSelect/types.d.ts.map +1 -0
  212. package/dist/cssm/components/CustomSelect/types.js +3 -0
  213. package/dist/cssm/components/CustomSelect/types.js.map +1 -0
  214. package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.d.ts +1 -1
  215. package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.d.ts.map +1 -1
  216. package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.js +2 -13
  217. package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.js.map +1 -1
  218. package/dist/cssm/components/DateInput/DateInput.d.ts +1 -1
  219. package/dist/cssm/components/DateInput/DateInput.d.ts.map +1 -1
  220. package/dist/cssm/components/DateInput/DateInput.js.map +1 -1
  221. package/dist/cssm/components/DateRangeInput/DateRangeInput.d.ts +1 -1
  222. package/dist/cssm/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  223. package/dist/cssm/components/DateRangeInput/DateRangeInput.js.map +1 -1
  224. package/dist/cssm/components/Flex/FlexItem/FlexItem.d.ts +6 -4
  225. package/dist/cssm/components/Flex/FlexItem/FlexItem.d.ts.map +1 -1
  226. package/dist/cssm/components/Flex/FlexItem/FlexItem.js.map +1 -1
  227. package/dist/cssm/components/Footer/Footer.d.ts +1 -1
  228. package/dist/cssm/components/Footer/Footer.d.ts.map +1 -1
  229. package/dist/cssm/components/Footer/Footer.js +4 -2
  230. package/dist/cssm/components/Footer/Footer.js.map +1 -1
  231. package/dist/cssm/components/FormField/FormField.module.css +36 -23
  232. package/dist/cssm/components/FormItem/FormItem.js +3 -3
  233. package/dist/cssm/components/FormItem/FormItem.js.map +1 -1
  234. package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.d.ts.map +1 -1
  235. package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.js +4 -4
  236. package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.js.map +1 -1
  237. package/dist/cssm/components/Group/Group.d.ts.map +1 -1
  238. package/dist/cssm/components/Group/Group.js +3 -2
  239. package/dist/cssm/components/Group/Group.js.map +1 -1
  240. package/dist/cssm/components/ImageBase/ImageBase.module.css +0 -4
  241. package/dist/cssm/components/Link/Link.d.ts +1 -1
  242. package/dist/cssm/components/Link/Link.d.ts.map +1 -1
  243. package/dist/cssm/components/Link/Link.js +2 -3
  244. package/dist/cssm/components/Link/Link.js.map +1 -1
  245. package/dist/cssm/components/Removable/Removable.d.ts +5 -1
  246. package/dist/cssm/components/Removable/Removable.d.ts.map +1 -1
  247. package/dist/cssm/components/Removable/Removable.js +7 -5
  248. package/dist/cssm/components/Removable/Removable.js.map +1 -1
  249. package/dist/cssm/components/Removable/Removable.module.css +4 -0
  250. package/dist/cssm/components/RootComponent/RootComponent.d.ts +1 -1
  251. package/dist/cssm/components/RootComponent/RootComponent.d.ts.map +1 -1
  252. package/dist/cssm/components/RootComponent/RootComponent.js +2 -1
  253. package/dist/cssm/components/RootComponent/RootComponent.js.map +1 -1
  254. package/dist/cssm/components/RootComponent/RootComponent.module.css +10 -0
  255. package/dist/cssm/components/Search/Search.d.ts.map +1 -1
  256. package/dist/cssm/components/Search/Search.js +3 -2
  257. package/dist/cssm/components/Search/Search.js.map +1 -1
  258. package/dist/cssm/components/Select/Select.d.ts.map +1 -1
  259. package/dist/cssm/components/Select/Select.js +1 -1
  260. package/dist/cssm/components/Select/Select.js.map +1 -1
  261. package/dist/cssm/components/SelectTypography/SelectTypography.d.ts +2 -2
  262. package/dist/cssm/components/SelectTypography/SelectTypography.d.ts.map +1 -1
  263. package/dist/cssm/components/SelectTypography/SelectTypography.js.map +1 -1
  264. package/dist/cssm/components/SimpleCell/SimpleCell.d.ts +1 -1
  265. package/dist/cssm/components/SimpleCell/SimpleCell.d.ts.map +1 -1
  266. package/dist/cssm/components/SimpleCell/SimpleCell.js +1 -1
  267. package/dist/cssm/components/SimpleCell/SimpleCell.js.map +1 -1
  268. package/dist/cssm/components/SimpleCell/SimpleCell.module.css +4 -0
  269. package/dist/cssm/components/Snackbar/Snackbar.js +3 -3
  270. package/dist/cssm/components/Snackbar/Snackbar.js.map +1 -1
  271. package/dist/cssm/components/ToolButton/ToolButton.d.ts +1 -1
  272. package/dist/cssm/components/ToolButton/ToolButton.d.ts.map +1 -1
  273. package/dist/cssm/components/ToolButton/ToolButton.js +2 -3
  274. package/dist/cssm/components/ToolButton/ToolButton.js.map +1 -1
  275. package/dist/cssm/components/View/View.d.ts.map +1 -1
  276. package/dist/cssm/components/View/View.js +17 -33
  277. package/dist/cssm/components/View/View.js.map +1 -1
  278. package/dist/cssm/hooks/useEnsuredControl.d.ts.map +1 -1
  279. package/dist/cssm/hooks/useEnsuredControl.js +27 -3
  280. package/dist/cssm/hooks/useEnsuredControl.js.map +1 -1
  281. package/dist/cssm/hooks/useIsClient.d.ts +1 -1
  282. package/dist/cssm/hooks/useIsClient.js +1 -1
  283. package/dist/cssm/hooks/useIsClient.js.map +1 -1
  284. package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
  285. package/dist/cssm/styles/constants.css +2 -3
  286. package/dist/hooks/useEnsuredControl.d.ts.map +1 -1
  287. package/dist/hooks/useEnsuredControl.js +27 -3
  288. package/dist/hooks/useEnsuredControl.js.map +1 -1
  289. package/dist/hooks/useIsClient.d.ts +1 -1
  290. package/dist/hooks/useIsClient.js +1 -1
  291. package/dist/hooks/useIsClient.js.map +1 -1
  292. package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
  293. package/dist/vkui.css +3 -3
  294. package/dist/vkui.css.map +1 -1
  295. package/dist/vkui.js.tmp +260 -263
  296. package/package.json +1 -1
  297. package/src/components/Button/Button.tsx +2 -2
  298. package/src/components/Cell/Cell.module.css +0 -4
  299. package/src/components/Cell/Cell.tsx +9 -16
  300. package/src/components/ChipsInputBase/Chip/Chip.tsx +3 -3
  301. package/src/components/ChipsSelect/ChipsSelect.tsx +12 -12
  302. package/src/components/Clickable/Clickable.tsx +4 -1
  303. package/src/components/CustomSelect/CustomSelect.tsx +52 -104
  304. package/src/components/CustomSelect/CustomSelectInput.module.css +55 -35
  305. package/src/components/CustomSelect/CustomSelectInput.tsx +25 -36
  306. package/src/components/CustomSelect/helpers.tsx +61 -0
  307. package/src/components/CustomSelect/types.ts +15 -0
  308. package/src/components/CustomSelectDropdown/CustomSelectDropdown.tsx +3 -17
  309. package/src/components/DateInput/DateInput.tsx +1 -1
  310. package/src/components/DateRangeInput/DateRangeInput.tsx +1 -1
  311. package/src/components/Flex/FlexItem/FlexItem.tsx +6 -4
  312. package/src/components/Footer/Footer.tsx +14 -2
  313. package/src/components/FormField/FormField.module.css +32 -21
  314. package/src/components/FormItem/FormItem.tsx +3 -3
  315. package/src/components/FormLayoutGroup/FormLayoutGroup.tsx +4 -8
  316. package/src/components/Group/Group.tsx +3 -2
  317. package/src/components/ImageBase/ImageBase.module.css +0 -4
  318. package/src/components/Link/Link.tsx +1 -3
  319. package/src/components/Removable/Removable.module.css +4 -0
  320. package/src/components/Removable/Removable.tsx +12 -4
  321. package/src/components/RootComponent/RootComponent.module.css +10 -0
  322. package/src/components/RootComponent/RootComponent.tsx +12 -2
  323. package/src/components/Search/Search.tsx +3 -2
  324. package/src/components/Select/Select.tsx +0 -1
  325. package/src/components/SelectTypography/SelectTypography.tsx +2 -5
  326. package/src/components/SimpleCell/SimpleCell.module.css +4 -0
  327. package/src/components/SimpleCell/SimpleCell.tsx +2 -1
  328. package/src/components/Snackbar/Snackbar.tsx +3 -3
  329. package/src/components/ToolButton/ToolButton.tsx +1 -3
  330. package/src/components/View/View.tsx +21 -36
  331. package/src/hooks/useEnsuredControl.ts +38 -4
  332. package/src/hooks/useIsClient.ts +1 -1
  333. package/src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts +1 -1
  334. package/src/styles/constants.css +2 -3
@@ -2,14 +2,12 @@ import * as React from 'react';
2
2
  import { classNames } from '@vkontakte/vkjs';
3
3
  import { useAdaptivity } from '../../hooks/useAdaptivity';
4
4
  import { useExternRef } from '../../hooks/useExternRef';
5
- import { useFocusWithin } from '../../hooks/useFocusWithin';
6
5
  import { usePlatform } from '../../hooks/usePlatform';
7
6
  import { getFormFieldModeFromSelectType } from '../../lib/select';
8
7
  import { HasAlign, HasRef, HasRootRef } from '../../types';
9
8
  import { FormField, FormFieldProps } from '../FormField/FormField';
10
9
  import type { SelectType } from '../Select/Select';
11
10
  import { SelectTypography } from '../SelectTypography/SelectTypography';
12
- import { Text } from '../Typography/Text/Text';
13
11
  import { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';
14
12
  import styles from './CustomSelectInput.module.css';
15
13
 
@@ -23,11 +21,13 @@ export interface CustomSelectInputProps
23
21
  HasRef<HTMLInputElement>,
24
22
  HasRootRef<HTMLDivElement>,
25
23
  HasAlign,
26
- Omit<FormFieldProps, 'mode' | 'type'> {
24
+ Omit<FormFieldProps, 'mode' | 'type' | 'maxHeight'> {
27
25
  selectType?: SelectType;
28
26
  multiline?: boolean;
29
27
  labelTextTestId?: string;
30
28
  fetching?: boolean;
29
+ searchable?: boolean;
30
+ selectedOptionLabel?: React.ReactElement | string;
31
31
  }
32
32
 
33
33
  /**
@@ -43,42 +43,35 @@ export const CustomSelectInput = ({
43
43
  before,
44
44
  after,
45
45
  status,
46
- children,
47
- placeholder,
46
+ selectedOptionLabel,
48
47
  selectType = 'default',
49
48
  multiline,
50
49
  disabled,
51
50
  fetching,
52
51
  labelTextTestId,
53
- ...restProps
52
+ searchable,
53
+ ...restInputProps
54
54
  }: CustomSelectInputProps): React.ReactNode => {
55
55
  const { sizeY = 'none' } = useAdaptivity();
56
56
 
57
- const title = children || placeholder;
58
- const showLabelOrPlaceholder = !Boolean(restProps.value);
59
-
60
57
  const handleRootRef = useExternRef(getRootRef);
61
- const focusWithin = useFocusWithin(handleRootRef);
58
+
59
+ const platform = usePlatform();
62
60
 
63
61
  const input = (
64
- <Text
62
+ <SelectTypography
63
+ selectType={selectType}
65
64
  type="text"
66
- {...restProps}
65
+ {...restInputProps}
67
66
  disabled={disabled && !fetching}
68
- readOnly={restProps.readOnly || (disabled && fetching)}
67
+ readOnly={restInputProps.readOnly || !searchable || (disabled && fetching)}
69
68
  Component="input"
70
69
  normalize={false}
71
- className={classNames(
72
- styles['CustomSelectInput__el'],
73
- (restProps.readOnly || (showLabelOrPlaceholder && !focusWithin)) &&
74
- styles['CustomSelectInput__el--cursor-pointer'],
75
- )}
70
+ className={styles['CustomSelectInput__input']}
76
71
  getRootRef={getRef}
77
- placeholder={children ? '' : placeholder}
78
72
  />
79
73
  );
80
74
 
81
- const platform = usePlatform();
82
75
  return (
83
76
  <FormField
84
77
  Component="div"
@@ -87,7 +80,7 @@ export const CustomSelectInput = ({
87
80
  styles['CustomSelectInput'],
88
81
  align === 'right' && styles['CustomSelectInput--align-right'],
89
82
  align === 'center' && styles['CustomSelectInput--align-center'],
90
- !children && styles['CustomSelectInput--empty'],
83
+ !selectedOptionLabel && styles['CustomSelectInput--empty'],
91
84
  multiline && styles['CustomSelectInput--multiline'],
92
85
  sizeY !== 'regular' && sizeYClassNames[sizeY],
93
86
  before && styles['CustomSelectInput--hasBefore'],
@@ -102,16 +95,6 @@ export const CustomSelectInput = ({
102
95
  status={status}
103
96
  >
104
97
  <div className={styles['CustomSelectInput__input-group']}>
105
- <div
106
- className={classNames(styles['CustomSelectInput__container'], className)}
107
- tabIndex={-1}
108
- aria-hidden
109
- data-testid={labelTextTestId}
110
- >
111
- <SelectTypography selectType={selectType} className={styles['CustomSelectInput__title']}>
112
- {showLabelOrPlaceholder && title}
113
- </SelectTypography>
114
- </div>
115
98
  {/* Чтобы отключить autosuggestion в iOS, тултипы которого начинают всплывать даже когда input
116
99
  * в режиме readonly, мы оборачиваем инпут в VisuallyHidden.
117
100
  * Тултипы появляются при каждом клике на input.
@@ -121,11 +104,17 @@ export const CustomSelectInput = ({
121
104
  * Делаем это только для режима read-only. Потому что проблема именно в режиме read-only.
122
105
  * Обертка вокруг инпута обрабатывает клики и передаёт фокус, так что на взаимодействии с инпутом это никак не скажется.
123
106
  **/}
124
- {restProps.readOnly && platform === 'ios' ? (
125
- <VisuallyHidden>{input}</VisuallyHidden>
126
- ) : (
127
- input
128
- )}
107
+ {!searchable && platform === 'ios' ? <VisuallyHidden>{input}</VisuallyHidden> : input}
108
+ <div
109
+ className={classNames(styles['CustomSelectInput__label-wrapper'], className)}
110
+ tabIndex={-1}
111
+ aria-hidden
112
+ data-testid={labelTextTestId}
113
+ >
114
+ <SelectTypography selectType={selectType} className={styles['CustomSelectInput__label']}>
115
+ {selectedOptionLabel || restInputProps.placeholder}
116
+ </SelectTypography>
117
+ </div>
129
118
  </div>
130
119
  </FormField>
131
120
  );
@@ -0,0 +1,61 @@
1
+ import * as React from 'react';
2
+ import { getTextFromChildren } from '../../lib/children';
3
+ import { CustomSelectOption } from '../CustomSelectOption/CustomSelectOption';
4
+ import type { CustomSelectOptionInterface, CustomSelectRenderOption, SelectValue } from './types';
5
+
6
+ export const findIndexAfter = (options: CustomSelectOptionInterface[] = [], startIndex = -1) => {
7
+ if (startIndex >= options.length - 1) {
8
+ return -1;
9
+ }
10
+ return options.findIndex((option, i) => i > startIndex && !option.disabled);
11
+ };
12
+
13
+ export const findIndexBefore = (
14
+ options: CustomSelectOptionInterface[] = [],
15
+ endIndex: number = options.length,
16
+ ) => {
17
+ let result = -1;
18
+ if (endIndex <= 0) {
19
+ return result;
20
+ }
21
+ for (let i = endIndex - 1; i >= 0; i--) {
22
+ let option = options[i];
23
+
24
+ if (!option.disabled) {
25
+ result = i;
26
+ break;
27
+ }
28
+ }
29
+ return result;
30
+ };
31
+
32
+ export function findSelectedIndex<T extends CustomSelectOptionInterface>(
33
+ options: T[] = [],
34
+ value: SelectValue,
35
+ withClear: boolean,
36
+ ) {
37
+ if (withClear && value === '') {
38
+ return -1;
39
+ }
40
+ return (
41
+ options.findIndex((item) => {
42
+ value = typeof item.value === 'number' ? Number(value) : value;
43
+ return item.value === value;
44
+ }) ?? -1
45
+ );
46
+ }
47
+
48
+ export function calculateInputValueFromOptions<T extends CustomSelectOptionInterface>(
49
+ options: T[] = [],
50
+ selectValue: SelectValue,
51
+ ) {
52
+ const selectedOption = options.find((option) => option.value === selectValue);
53
+ return selectedOption ? getTextFromChildren(selectedOption.label) : '';
54
+ }
55
+
56
+ export function defaultRenderOptionFn<T extends CustomSelectOptionInterface>({
57
+ option,
58
+ ...props
59
+ }: CustomSelectRenderOption<T>): React.ReactNode {
60
+ return <CustomSelectOption {...props} />;
61
+ }
@@ -0,0 +1,15 @@
1
+ import { CustomSelectOptionProps } from '../CustomSelectOption/CustomSelectOption';
2
+
3
+ export type SelectValue = React.SelectHTMLAttributes<HTMLSelectElement>['value'];
4
+
5
+ export interface CustomSelectOptionInterface {
6
+ value: SelectValue;
7
+ label: React.ReactElement | string;
8
+ disabled?: boolean;
9
+ [index: string]: any;
10
+ }
11
+
12
+ export interface CustomSelectRenderOption<T extends CustomSelectOptionInterface>
13
+ extends CustomSelectOptionProps {
14
+ option: T;
15
+ }
@@ -32,15 +32,12 @@ export interface CustomSelectDropdownProps
32
32
  noMaxHeight?: boolean;
33
33
  }
34
34
 
35
- const calcIsTop = (placement: Placement) => placement.startsWith('top');
36
-
37
35
  export const CustomSelectDropdown = ({
38
36
  children,
39
37
  targetRef,
40
38
  scrollBoxRef,
41
39
  placement = 'bottom',
42
40
  fetching,
43
- onPlacementChange: parentOnPlacementChange,
44
41
  offsetDistance = 0,
45
42
  autoWidth = false,
46
43
  forcePortal = true,
@@ -52,30 +49,19 @@ export const CustomSelectDropdown = ({
52
49
  overscrollBehavior,
53
50
  ...restProps
54
51
  }: CustomSelectDropdownProps): React.ReactNode => {
55
- const [isTop, setIsTop] = React.useState(() => calcIsTop(placement));
56
-
57
- const onPlacementChange = React.useCallback(
58
- (placement: Placement) => {
59
- setIsTop(calcIsTop(placement));
60
- if (parentOnPlacementChange) {
61
- parentOnPlacementChange(placement);
62
- }
63
- },
64
- [parentOnPlacementChange],
65
- );
66
-
67
52
  return (
68
53
  <Popper
69
54
  targetRef={targetRef}
70
55
  offsetByMainAxis={offsetDistance}
71
56
  sameWidth={!autoWidth}
72
- onPlacementChange={onPlacementChange}
73
57
  placement={placement}
74
58
  className={classNames(
75
59
  styles['CustomSelectDropdown'],
76
60
  'vkuiInternalCustomSelectDropdown',
77
61
  offsetDistance === 0 &&
78
- (isTop ? styles['CustomSelectDropdown--top'] : styles['CustomSelectDropdown--bottom']),
62
+ (placement.includes('top')
63
+ ? styles['CustomSelectDropdown--top']
64
+ : styles['CustomSelectDropdown--bottom']),
79
65
  autoWidth &&
80
66
  classNames(
81
67
  styles['CustomSelectDropdown--wide'],
@@ -55,7 +55,7 @@ export interface DateInputProps
55
55
  | 'maxDateTime'
56
56
  >,
57
57
  HasRootRef<HTMLDivElement>,
58
- FormFieldProps {
58
+ Omit<FormFieldProps, 'maxHeight'> {
59
59
  calendarPlacement?: PlacementWithAuto;
60
60
  closeOnChange?: boolean;
61
61
  clearFieldLabel?: string;
@@ -45,7 +45,7 @@ export interface DateRangeInputProps
45
45
  | 'nextMonthIcon'
46
46
  >,
47
47
  HasRootRef<HTMLDivElement>,
48
- FormFieldProps {
48
+ Omit<FormFieldProps, 'maxHeight'> {
49
49
  calendarPlacement?: PlacementWithAuto;
50
50
  closeOnChange?: boolean;
51
51
  clearFieldLabel?: string;
@@ -24,10 +24,12 @@ export interface FlexItemProps extends HTMLAttributesWithRootRef<HTMLDivElement>
24
24
  */
25
25
  alignSelf?: 'start' | 'end' | 'center' | 'baseline' | 'stretch';
26
26
  /**
27
- * Позволяет задать предопределенные значения шортката `flex`
28
- * `grow` соответствует значению `1 0 auto`
29
- * `shrink` соответствует значению `0 1 auto`
30
- * `content` соответствует значению `0 0 auto`
27
+ * Позволяет задать предопределенные значения свойства `flex`:
28
+ *
29
+ * - `grow` соответствует значению `1 0 auto`
30
+ * - `shrink` соответствует значению `0 1 auto`
31
+ * - `content` соответствует значению `1 1 auto`
32
+ * - `fixed` соответствует значению `0 0 auto`
31
33
  */
32
34
  flex?: 'grow' | 'shrink' | 'content' | 'fixed';
33
35
  /**
@@ -9,9 +9,21 @@ export type FooterProps = React.AllHTMLAttributes<HTMLElement> & HasComponent;
9
9
  /**
10
10
  * @see https://vkcom.github.io/VKUI/#/Footer
11
11
  */
12
- export const Footer = ({ children, className, ...restProps }: FooterProps): React.ReactNode => {
12
+ export const Footer = ({
13
+ children,
14
+ className,
15
+ Component = 'footer',
16
+ role: roleProp,
17
+ ...restProps
18
+ }: FooterProps): React.ReactNode => {
19
+ const role = roleProp ?? (Component === 'footer' ? 'contentinfo' : undefined);
13
20
  return (
14
- <Footnote Component="footer" {...restProps} className={classNames(styles['Footer'], className)}>
21
+ <Footnote
22
+ Component={Component}
23
+ role={role}
24
+ {...restProps}
25
+ className={classNames(styles['Footer'], className)}
26
+ >
15
27
  {children}
16
28
  </Footnote>
17
29
  );
@@ -111,14 +111,33 @@
111
111
  background-color: var(--vkui--color_field_background);
112
112
  }
113
113
 
114
+ .FormField--hover {
115
+ background-color: var(--vkui--color_field_background);
116
+ }
117
+
118
+ .FormField--mode-default.FormField--hover .FormField__border {
119
+ border-color: var(--vkui--color_field_border_alpha--hover);
120
+ z-index: var(--vkui_internal--z_index_form_field_border_hover);
121
+ }
122
+
123
+ /**
124
+ * useFocusVisibleClassName()
125
+ */
126
+ /* increase specificity for selects */
127
+ .FormField--focus-visible.FormField--focus-visible .FormField__border {
128
+ border-color: var(--vkui--color_stroke_accent);
129
+ }
130
+
114
131
  /**
115
132
  * CMP:
116
133
  * FormItem
117
134
  * [start]
118
135
  */
119
136
  /* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
120
- :global(.vkuiInternalFormItem--status-error) .FormField__border,
121
- .FormField--status-error .FormField__border {
137
+ :global(.vkuiInternalFormItem--status-error) .FormField--mode-default .FormField__border,
138
+ :global(.vkuiInternalFormItem--status-error) .FormField--focus-visible .FormField__border,
139
+ .FormField--status-error.FormField--mode-default .FormField__border,
140
+ .FormField--status-error.FormField--focus-visible .FormField__border {
122
141
  border-color: var(--vkui--color_stroke_negative);
123
142
  z-index: var(--vkui_internal--z_index_form_field_status);
124
143
  }
@@ -129,12 +148,21 @@
129
148
  background-color: var(--vkui--color_background_negative_tint);
130
149
  }
131
150
 
151
+ /* increase specificity to cover --mode-default case */
132
152
  /* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
133
- :global(.vkuiInternalFormItem--status-valid) .FormField__border,
134
- .FormField--status-valid .FormField__border {
153
+ :global(.vkuiInternalFormItem--status-valid) .FormField--mode-default .FormField__border,
154
+ :global(.vkuiInternalFormItem--status-valid) .FormField--focus-visible .FormField__border,
155
+ .FormField--status-valid.FormField--mode-default .FormField__border,
156
+ .FormField--status-valid.FormField--focus-visible .FormField__border {
135
157
  border-color: var(--vkui--color_stroke_positive);
136
158
  z-index: var(--vkui_internal--z_index_form_field_status);
137
159
  }
160
+
161
+ /* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
162
+ :global(.vkuiInternalFormItem--status-valid) .FormField:not(.FormField--mode-default),
163
+ .FormField--status-valid:not(.FormField--mode-default) {
164
+ background-color: var(--vkui--color_background_positive_tint);
165
+ }
138
166
  /* [end] */
139
167
 
140
168
  .FormField--disabled {
@@ -143,15 +171,6 @@
143
171
  pointer-events: none;
144
172
  }
145
173
 
146
- .FormField--hover {
147
- background-color: var(--vkui--color_field_background);
148
- }
149
-
150
- .FormField--mode-default.FormField--hover .FormField__border {
151
- border-color: var(--vkui--color_field_border_alpha--hover);
152
- z-index: var(--vkui_internal--z_index_form_field_border_hover);
153
- }
154
-
155
174
  /**
156
175
  * CMP:
157
176
  * NativeSelect
@@ -221,11 +240,3 @@
221
240
  border-end-start-radius: var(--vkui--size_border_radius--regular);
222
241
  border-end-end-radius: var(--vkui--size_border_radius--regular);
223
242
  }
224
-
225
- /**
226
- * useFocusVisibleClassName()
227
- */
228
- /* increase specificity for selects */
229
- .FormField--focus-visible.FormField--focus-visible .FormField__border {
230
- border-color: var(--vkui--color_stroke_accent);
231
- }
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { classNames, hasReactNode, noop } from '@vkontakte/vkjs';
2
+ import { classNames, hasReactNode } from '@vkontakte/vkjs';
3
3
  import { useAdaptivity } from '../../hooks/useAdaptivity';
4
4
  import { useExternRef } from '../../hooks/useExternRef';
5
5
  import { useObjectMemo } from '../../hooks/useObjectMemo';
@@ -89,7 +89,7 @@ export const FormItem: React.FC<FormItemProps> & {
89
89
  bottom,
90
90
  status = 'default',
91
91
  removable,
92
- onRemove = noop,
92
+ onRemove,
93
93
  removePlaceholder = 'Удалить',
94
94
  getRootRef,
95
95
  htmlFor,
@@ -154,7 +154,7 @@ export const FormItem: React.FC<FormItemProps> & {
154
154
  align="start"
155
155
  onRemove={(e) => {
156
156
  if (rootEl?.current) {
157
- onRemove(e, rootEl.current);
157
+ onRemove?.(e, rootEl.current);
158
158
  }
159
159
  }}
160
160
  removePlaceholder={removePlaceholder}
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { classNames, noop } from '@vkontakte/vkjs';
2
+ import { classNames } from '@vkontakte/vkjs';
3
3
  import { useAdaptivity } from '../../hooks/useAdaptivity';
4
4
  import { useExternRef } from '../../hooks/useExternRef';
5
5
  import { HTMLAttributesWithRootRef } from '../../types';
@@ -44,7 +44,7 @@ export const FormLayoutGroup = ({
44
44
  removable,
45
45
  segmented,
46
46
  removePlaceholder = 'Удалить',
47
- onRemove = noop,
47
+ onRemove,
48
48
  getRootRef,
49
49
  ...restProps
50
50
  }: FormLayoutGroupProps): React.ReactNode => {
@@ -64,11 +64,7 @@ export const FormLayoutGroup = ({
64
64
  styles['FormLayoutGroup--mode-horizontal'],
65
65
  'vkuiInternalFormLayoutGroup--mode-horizontal',
66
66
  ),
67
- mode === 'vertical' &&
68
- classNames(
69
- styles['FormLayoutGroup--mode-vertical'],
70
- 'vkuiInternalFormLayoutGroup--mode-vertical',
71
- ),
67
+ mode === 'vertical' && 'vkuiInternalFormLayoutGroup--mode-vertical',
72
68
  isRemovable &&
73
69
  classNames(
74
70
  styles['FormLayoutGroup--removable'],
@@ -89,7 +85,7 @@ export const FormLayoutGroup = ({
89
85
  removePlaceholder={removePlaceholder}
90
86
  onRemove={(e) => {
91
87
  if (rootEl?.current) {
92
- onRemove(e, rootEl.current);
88
+ onRemove?.(e, rootEl.current);
93
89
  }
94
90
  }}
95
91
  indent={removable === 'indent'}
@@ -12,7 +12,8 @@ import styles from './Group.module.css';
12
12
 
13
13
  const sizeXClassNames = {
14
14
  none: classNames(styles['Group--sizeX-none'], 'vkuiInternalGroup--sizeX-none'),
15
- ['compact']: styles['Group--sizeX-compact'],
15
+ regular: styles['Group--sizeX-regular'],
16
+ compact: styles['Group--sizeX-compact'],
16
17
  };
17
18
 
18
19
  const stylesMode = {
@@ -140,7 +141,7 @@ export const Group = ({
140
141
  baseClassName={classNames(
141
142
  'vkuiInternalGroup',
142
143
  styles['Group'],
143
- sizeX !== 'regular' && sizeXClassNames[sizeX],
144
+ sizeXClassNames[sizeX],
144
145
  mode === 'plain' && isInsideModal && styles['Group--mode-plain-inside-modal'],
145
146
  stylesMode[mode],
146
147
  stylesPadding[padding],
@@ -31,10 +31,6 @@
31
31
  }
32
32
 
33
33
  .ImageBase__img {
34
- position: absolute;
35
- z-index: var(--vkui_internal--z_index_image_base_img);
36
- inset-block-start: 0;
37
- inset-inline-start: 0;
38
34
  display: block;
39
35
  inline-size: 100%;
40
36
  block-size: 100%;
@@ -1,4 +1,4 @@
1
- import { classNames, noop } from '@vkontakte/vkjs';
1
+ import { classNames } from '@vkontakte/vkjs';
2
2
  import { Tappable, TappableProps } from '../Tappable/Tappable';
3
3
  import styles from './Link.module.css';
4
4
 
@@ -16,13 +16,11 @@ export const Link = ({
16
16
  hasVisited,
17
17
  children,
18
18
  className,
19
- onClick = noop,
20
19
  ...restProps
21
20
  }: LinkProps): React.ReactNode => {
22
21
  return (
23
22
  <Tappable
24
23
  Component={restProps.href ? 'a' : 'button'}
25
- onClick={onClick}
26
24
  {...restProps}
27
25
  className={classNames(styles['Link'], hasVisited && styles['Link--has-visited'], className)}
28
26
  hasHover={false}
@@ -17,6 +17,10 @@
17
17
  align-self: flex-start;
18
18
  }
19
19
 
20
+ .Removable--disabled {
21
+ opacity: var(--vkui--opacity_disable_accessibility);
22
+ }
23
+
20
24
  /**
21
25
  * iOS
22
26
  */
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { Icon24Cancel } from '@vkontakte/icons';
3
- import { classNames, noop } from '@vkontakte/vkjs';
3
+ import { classNames } from '@vkontakte/vkjs';
4
4
  import { useGlobalEventListener } from '../../hooks/useGlobalEventListener';
5
5
  import { usePlatform } from '../../hooks/usePlatform';
6
6
  import { getTextFromChildren } from '../../lib/children';
@@ -29,6 +29,10 @@ export interface RemovableProps {
29
29
  * (test) testId кнопки удаления
30
30
  */
31
31
  removeButtonTestId?: string;
32
+ /**
33
+ * Ячейка превращается в неактивную
34
+ */
35
+ disabled?: boolean;
32
36
  }
33
37
 
34
38
  interface RemovableIosOwnProps extends RemovableProps {
@@ -46,6 +50,7 @@ const RemovableIos = ({
46
50
  children: childrenProp,
47
51
  toggleButtonTestId,
48
52
  removeButtonTestId,
53
+ disabled,
49
54
  }: RemovableIosOwnProps) => {
50
55
  const { window } = useDOM();
51
56
 
@@ -97,7 +102,7 @@ const RemovableIos = ({
97
102
  'vkuiInternalRemovable__action',
98
103
  )}
99
104
  onClick={onRemoveActivateClick}
100
- disabled={removeOffset > 0}
105
+ disabled={removeOffset > 0 || disabled}
101
106
  data-testid={toggleButtonTestId}
102
107
  >
103
108
  <VisuallyHidden>{removePlaceholderString}</VisuallyHidden>
@@ -155,19 +160,20 @@ interface RemovableOwnProps
155
160
  */
156
161
  export const Removable = ({
157
162
  children,
158
- onRemove = noop,
163
+ onRemove,
159
164
  removePlaceholder = 'Удалить',
160
165
  align = 'center',
161
166
  indent = false,
162
167
  toggleButtonTestId,
163
168
  removeButtonTestId,
169
+ disabled,
164
170
  ...restProps
165
171
  }: RemovableOwnProps): React.ReactNode => {
166
172
  const platform = usePlatform();
167
173
 
168
174
  const onRemoveClick = (e: React.MouseEvent) => {
169
175
  e.preventDefault();
170
- onRemove(e);
176
+ onRemove?.(e);
171
177
  };
172
178
 
173
179
  const removePlaceholderString: string = getTextFromChildren(removePlaceholder);
@@ -192,6 +198,7 @@ export const Removable = ({
192
198
  onClick={onRemoveClick}
193
199
  label={removePlaceholderString}
194
200
  data-testid={removeButtonTestId}
201
+ disabled={disabled}
195
202
  >
196
203
  <Icon24Cancel role="presentation" />
197
204
  </IconButton>
@@ -207,6 +214,7 @@ export const Removable = ({
207
214
  removePlaceholderString={removePlaceholderString}
208
215
  toggleButtonTestId={toggleButtonTestId}
209
216
  removeButtonTestId={removeButtonTestId}
217
+ disabled={disabled}
210
218
  >
211
219
  {children}
212
220
  </RemovableIos>
@@ -0,0 +1,10 @@
1
+ .RootComponent[hidden='hidden'],
2
+ .RootComponent--hidden {
3
+ /* stylelint-disable-next-line declaration-no-important */
4
+ display: none !important;
5
+ }
6
+
7
+ .RootComponent[hidden='until-found'] {
8
+ /* stylelint-disable-next-line declaration-no-important */
9
+ content-visibility: hidden !important;
10
+ }
@@ -1,6 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { classNames } from '@vkontakte/vkjs';
3
- import { HasComponent, HasRootRef } from '../../types';
3
+ import type { HasComponent, HasRootRef } from '../../types';
4
+ import styles from './RootComponent.module.css';
4
5
 
5
6
  export interface RootComponentProps<T>
6
7
  extends React.AllHTMLAttributes<T>,
@@ -19,5 +20,14 @@ export const RootComponent = <T,>({
19
20
  getRootRef,
20
21
  ...restProps
21
22
  }: RootComponentProps<T>): React.ReactNode => (
22
- <Component ref={getRootRef} className={classNames(baseClassName, className)} {...restProps} />
23
+ <Component
24
+ ref={getRootRef}
25
+ className={classNames(
26
+ className,
27
+ baseClassName,
28
+ styles['RootComponent'],
29
+ restProps.hidden === true && styles['RootComponent--hidden'],
30
+ )}
31
+ {...restProps}
32
+ />
23
33
  );
@@ -61,7 +61,7 @@ export const Search = ({
61
61
  after = 'Отмена',
62
62
  getRef,
63
63
  icon: iconProp,
64
- onIconClick = noop,
64
+ onIconClick,
65
65
  style,
66
66
  autoComplete = 'off',
67
67
  onChange,
@@ -115,7 +115,7 @@ export const Search = ({
115
115
  }, [inputRef]);
116
116
 
117
117
  const onIconClickStart: React.PointerEventHandler<HTMLElement> = React.useCallback(
118
- (e) => onIconClick(e),
118
+ (e) => onIconClick?.(e),
119
119
  [onIconClick],
120
120
  );
121
121
 
@@ -206,6 +206,7 @@ export const Search = ({
206
206
  onClick={onCancel}
207
207
  className={styles['Search__icon']}
208
208
  tabIndex={hasValue ? undefined : -1}
209
+ disabled={inputProps.disabled}
209
210
  >
210
211
  <VisuallyHidden>{clearLabel}</VisuallyHidden>
211
212
  {platform === 'ios' ? <Icon16Clear /> : <Icon24Cancel />}