@vkontakte/vkui 4.15.0 → 4.16.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 (349) hide show
  1. package/.cache/.eslintcache +1 -1
  2. package/.cache/.stylelintcache +1 -1
  3. package/.cache/.tsbuildinfo +391 -282
  4. package/.cache/ts/src/components/AppRoot/AppRoot.d.ts +1 -0
  5. package/.cache/ts/src/components/ChipsSelect/ChipsSelect.d.ts +1 -1
  6. package/.cache/ts/src/components/CustomSelect/CustomSelect.d.ts +2 -2
  7. package/.cache/ts/src/components/FixedLayout/FixedLayout.d.ts +4 -9
  8. package/.cache/ts/src/components/ModalPage/ModalPage.d.ts +1 -2
  9. package/.cache/ts/src/components/Root/Root.d.ts +5 -27
  10. package/.cache/ts/src/components/SimpleCheckbox/SimpleCheckbox.d.ts +9 -0
  11. package/.cache/ts/src/components/Tappable/Tappable.d.ts +12 -9
  12. package/.cache/ts/src/components/Touch/Touch.d.ts +1 -2
  13. package/.cache/ts/src/components/UsersStack/masks.d.ts +1 -1
  14. package/.cache/ts/src/hooks/useEventListener.d.ts +2 -2
  15. package/.cache/ts/src/hooks/useKeyboard.d.ts +11 -0
  16. package/.cache/ts/src/index.d.ts +1 -1
  17. package/.cache/ts/src/lib/select.d.ts +7 -0
  18. package/.cache/ts/src/lib/touch.d.ts +1 -1
  19. package/.cache/ts/src/lib/utils.d.ts +2 -3
  20. package/.cache/ts/src/types.d.ts +2 -6
  21. package/.cache/ts/src/unstable/index.d.ts +2 -0
  22. package/babel.cjs.config.js +7 -1
  23. package/babel.config.js +7 -1
  24. package/dist/cjs/components/AppRoot/AppRoot.d.ts +1 -0
  25. package/dist/cjs/components/AppRoot/AppRoot.js +29 -1
  26. package/dist/cjs/components/AppRoot/AppRoot.js.map +1 -1
  27. package/dist/cjs/components/Banner/Banner.js +1 -1
  28. package/dist/cjs/components/Banner/Banner.js.map +1 -1
  29. package/dist/cjs/components/Cell/Cell.js +3 -3
  30. package/dist/cjs/components/Cell/Cell.js.map +1 -1
  31. package/dist/cjs/components/ChipsSelect/ChipsSelect.d.ts +1 -1
  32. package/dist/cjs/components/ChipsSelect/ChipsSelect.js +5 -6
  33. package/dist/cjs/components/ChipsSelect/ChipsSelect.js.map +1 -1
  34. package/dist/cjs/components/ChipsSelect/useChipsSelect.js +2 -2
  35. package/dist/cjs/components/ChipsSelect/useChipsSelect.js.map +1 -1
  36. package/dist/cjs/components/CustomSelect/CustomSelect.d.ts +2 -2
  37. package/dist/cjs/components/CustomSelect/CustomSelect.js +3 -3
  38. package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
  39. package/dist/cjs/components/FixedLayout/FixedLayout.d.ts +4 -9
  40. package/dist/cjs/components/FixedLayout/FixedLayout.js +91 -179
  41. package/dist/cjs/components/FixedLayout/FixedLayout.js.map +1 -1
  42. package/dist/cjs/components/Gallery/Gallery.js +2 -2
  43. package/dist/cjs/components/Gallery/Gallery.js.map +1 -1
  44. package/dist/cjs/components/Header/Header.js +1 -1
  45. package/dist/cjs/components/Header/Header.js.map +1 -1
  46. package/dist/cjs/components/ModalCardBase/ModalCardBase.js +6 -1
  47. package/dist/cjs/components/ModalCardBase/ModalCardBase.js.map +1 -1
  48. package/dist/cjs/components/ModalPage/ModalPage.d.ts +1 -2
  49. package/dist/cjs/components/ModalPage/ModalPage.js.map +1 -1
  50. package/dist/cjs/components/ModalRoot/ModalRoot.js +2 -2
  51. package/dist/cjs/components/ModalRoot/ModalRoot.js.map +1 -1
  52. package/dist/cjs/components/Panel/Panel.js +2 -2
  53. package/dist/cjs/components/Panel/Panel.js.map +1 -1
  54. package/dist/cjs/components/PanelHeaderContent/PanelHeaderContent.js +0 -1
  55. package/dist/cjs/components/PanelHeaderContent/PanelHeaderContent.js.map +1 -1
  56. package/dist/cjs/components/PullToRefresh/PullToRefresh.js +2 -2
  57. package/dist/cjs/components/PullToRefresh/PullToRefresh.js.map +1 -1
  58. package/dist/cjs/components/RangeSlider/UniversalSlider.js +2 -2
  59. package/dist/cjs/components/RangeSlider/UniversalSlider.js.map +1 -1
  60. package/dist/cjs/components/Root/Root.d.ts +5 -27
  61. package/dist/cjs/components/Root/Root.js +158 -214
  62. package/dist/cjs/components/Root/Root.js.map +1 -1
  63. package/dist/cjs/components/Search/Search.js +3 -3
  64. package/dist/cjs/components/Search/Search.js.map +1 -1
  65. package/dist/cjs/components/SimpleCell/SimpleCell.js.map +1 -1
  66. package/dist/cjs/components/SimpleCheckbox/SimpleCheckbox.d.ts +9 -0
  67. package/dist/cjs/components/SimpleCheckbox/SimpleCheckbox.js +126 -0
  68. package/dist/cjs/components/SimpleCheckbox/SimpleCheckbox.js.map +1 -0
  69. package/dist/cjs/components/Snackbar/Snackbar.js +2 -2
  70. package/dist/cjs/components/Snackbar/Snackbar.js.map +1 -1
  71. package/dist/cjs/components/Tappable/Tappable.d.ts +12 -9
  72. package/dist/cjs/components/Tappable/Tappable.js +47 -36
  73. package/dist/cjs/components/Tappable/Tappable.js.map +1 -1
  74. package/dist/cjs/components/Touch/Touch.d.ts +1 -2
  75. package/dist/cjs/components/Touch/Touch.js +172 -283
  76. package/dist/cjs/components/Touch/Touch.js.map +1 -1
  77. package/dist/cjs/components/UsersStack/UsersStack.js +9 -18
  78. package/dist/cjs/components/UsersStack/UsersStack.js.map +1 -1
  79. package/dist/cjs/components/UsersStack/masks.d.ts +1 -1
  80. package/dist/cjs/components/UsersStack/masks.js +5 -8
  81. package/dist/cjs/components/UsersStack/masks.js.map +1 -1
  82. package/dist/cjs/components/View/View.js +2 -2
  83. package/dist/cjs/components/View/View.js.map +1 -1
  84. package/dist/cjs/components/View/ViewInfinite.js +2 -2
  85. package/dist/cjs/components/View/ViewInfinite.js.map +1 -1
  86. package/dist/cjs/hooks/useEventListener.d.ts +2 -2
  87. package/dist/cjs/hooks/useEventListener.js +9 -4
  88. package/dist/cjs/hooks/useEventListener.js.map +1 -1
  89. package/dist/cjs/hooks/useGlobalEventListener.js +2 -4
  90. package/dist/cjs/hooks/useGlobalEventListener.js.map +1 -1
  91. package/dist/cjs/hooks/useInsets.js +3 -10
  92. package/dist/cjs/hooks/useInsets.js.map +1 -1
  93. package/dist/cjs/hooks/useKeyboard.d.ts +11 -0
  94. package/dist/cjs/hooks/useKeyboard.js +78 -0
  95. package/dist/cjs/hooks/useKeyboard.js.map +1 -0
  96. package/dist/cjs/hooks/useKeyboardInputTracker.js +4 -2
  97. package/dist/cjs/hooks/useKeyboardInputTracker.js.map +1 -1
  98. package/dist/cjs/index.d.ts +1 -1
  99. package/dist/cjs/index.js +2 -2
  100. package/dist/cjs/index.js.map +1 -1
  101. package/dist/cjs/lib/select.d.ts +7 -0
  102. package/dist/cjs/lib/select.js +73 -0
  103. package/dist/cjs/lib/select.js.map +1 -0
  104. package/dist/cjs/lib/touch.d.ts +1 -1
  105. package/dist/cjs/lib/touch.js +6 -2
  106. package/dist/cjs/lib/touch.js.map +1 -1
  107. package/dist/cjs/lib/utils.d.ts +2 -3
  108. package/dist/cjs/lib/utils.js.map +1 -1
  109. package/dist/cjs/types.d.ts +2 -6
  110. package/dist/cjs/unstable/index.d.ts +2 -0
  111. package/dist/cjs/unstable/index.js +8 -0
  112. package/dist/cjs/unstable/index.js.map +1 -1
  113. package/dist/components/AppRoot/AppRoot.d.ts +1 -0
  114. package/dist/components/AppRoot/AppRoot.js +29 -5
  115. package/dist/components/AppRoot/AppRoot.js.map +1 -1
  116. package/dist/components/Banner/Banner.js +1 -1
  117. package/dist/components/Banner/Banner.js.map +1 -1
  118. package/dist/components/Cell/Cell.js +1 -1
  119. package/dist/components/Cell/Cell.js.map +1 -1
  120. package/dist/components/ChipsSelect/ChipsSelect.d.ts +1 -1
  121. package/dist/components/ChipsSelect/ChipsSelect.js +4 -6
  122. package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
  123. package/dist/components/ChipsSelect/useChipsSelect.js +2 -2
  124. package/dist/components/ChipsSelect/useChipsSelect.js.map +1 -1
  125. package/dist/components/CustomSelect/CustomSelect.d.ts +2 -2
  126. package/dist/components/CustomSelect/CustomSelect.js +2 -3
  127. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  128. package/dist/components/FixedLayout/FixedLayout.d.ts +4 -9
  129. package/dist/components/FixedLayout/FixedLayout.js +84 -175
  130. package/dist/components/FixedLayout/FixedLayout.js.map +1 -1
  131. package/dist/components/Gallery/Gallery.js +1 -1
  132. package/dist/components/Gallery/Gallery.js.map +1 -1
  133. package/dist/components/Header/Header.js +1 -1
  134. package/dist/components/Header/Header.js.map +1 -1
  135. package/dist/components/ModalCardBase/ModalCardBase.js +5 -1
  136. package/dist/components/ModalCardBase/ModalCardBase.js.map +1 -1
  137. package/dist/components/ModalPage/ModalPage.d.ts +1 -2
  138. package/dist/components/ModalPage/ModalPage.js.map +1 -1
  139. package/dist/components/ModalRoot/ModalRoot.js +1 -1
  140. package/dist/components/ModalRoot/ModalRoot.js.map +1 -1
  141. package/dist/components/Panel/Panel.js +1 -1
  142. package/dist/components/Panel/Panel.js.map +1 -1
  143. package/dist/components/PanelHeaderContent/PanelHeaderContent.js +0 -1
  144. package/dist/components/PanelHeaderContent/PanelHeaderContent.js.map +1 -1
  145. package/dist/components/PullToRefresh/PullToRefresh.js +1 -1
  146. package/dist/components/PullToRefresh/PullToRefresh.js.map +1 -1
  147. package/dist/components/RangeSlider/UniversalSlider.js +1 -1
  148. package/dist/components/RangeSlider/UniversalSlider.js.map +1 -1
  149. package/dist/components/Root/Root.d.ts +5 -27
  150. package/dist/components/Root/Root.js +152 -207
  151. package/dist/components/Root/Root.js.map +1 -1
  152. package/dist/components/Search/Search.js +1 -1
  153. package/dist/components/Search/Search.js.map +1 -1
  154. package/dist/components/SimpleCell/SimpleCell.js.map +1 -1
  155. package/dist/components/SimpleCheckbox/SimpleCheckbox.d.ts +9 -0
  156. package/dist/components/SimpleCheckbox/SimpleCheckbox.js +97 -0
  157. package/dist/components/SimpleCheckbox/SimpleCheckbox.js.map +1 -0
  158. package/dist/components/Snackbar/Snackbar.js +1 -1
  159. package/dist/components/Snackbar/Snackbar.js.map +1 -1
  160. package/dist/components/Tappable/Tappable.d.ts +12 -9
  161. package/dist/components/Tappable/Tappable.js +45 -37
  162. package/dist/components/Tappable/Tappable.js.map +1 -1
  163. package/dist/components/Touch/Touch.d.ts +1 -2
  164. package/dist/components/Touch/Touch.js +163 -286
  165. package/dist/components/Touch/Touch.js.map +1 -1
  166. package/dist/components/UsersStack/UsersStack.js +7 -16
  167. package/dist/components/UsersStack/UsersStack.js.map +1 -1
  168. package/dist/components/UsersStack/masks.d.ts +1 -1
  169. package/dist/components/UsersStack/masks.js +6 -9
  170. package/dist/components/UsersStack/masks.js.map +1 -1
  171. package/dist/components/View/View.js +1 -1
  172. package/dist/components/View/View.js.map +1 -1
  173. package/dist/components/View/ViewInfinite.js +1 -1
  174. package/dist/components/View/ViewInfinite.js.map +1 -1
  175. package/dist/components.css +1 -1
  176. package/dist/components.css.map +1 -1
  177. package/dist/cssm/components/ActionSheetItem/ActionSheetItem.css +1 -1
  178. package/dist/cssm/components/AppRoot/AppRoot.css +1 -0
  179. package/dist/cssm/components/AppRoot/AppRoot.js +30 -2
  180. package/dist/cssm/components/AppRoot/AppRoot.js.map +1 -1
  181. package/dist/cssm/components/Banner/Banner.css +1 -1
  182. package/dist/cssm/components/Banner/Banner.js +1 -1
  183. package/dist/cssm/components/Banner/Banner.js.map +1 -1
  184. package/dist/cssm/components/Cell/Cell.js +1 -1
  185. package/dist/cssm/components/Cell/Cell.js.map +1 -1
  186. package/dist/cssm/components/ChipsSelect/ChipsSelect.js +4 -6
  187. package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
  188. package/dist/cssm/components/ChipsSelect/useChipsSelect.js +2 -2
  189. package/dist/cssm/components/ChipsSelect/useChipsSelect.js.map +1 -1
  190. package/dist/cssm/components/CustomSelect/CustomSelect.js +2 -3
  191. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  192. package/dist/cssm/components/FixedLayout/FixedLayout.js +84 -175
  193. package/dist/cssm/components/FixedLayout/FixedLayout.js.map +1 -1
  194. package/dist/cssm/components/Gallery/Gallery.js +1 -1
  195. package/dist/cssm/components/Gallery/Gallery.js.map +1 -1
  196. package/dist/cssm/components/Header/Header.js +1 -1
  197. package/dist/cssm/components/Header/Header.js.map +1 -1
  198. package/dist/cssm/components/ModalCardBase/ModalCardBase.css +1 -1
  199. package/dist/cssm/components/ModalCardBase/ModalCardBase.js +5 -1
  200. package/dist/cssm/components/ModalCardBase/ModalCardBase.js.map +1 -1
  201. package/dist/cssm/components/ModalPage/ModalPage.js.map +1 -1
  202. package/dist/cssm/components/ModalRoot/ModalRoot.css +1 -1
  203. package/dist/cssm/components/ModalRoot/ModalRoot.js +1 -1
  204. package/dist/cssm/components/ModalRoot/ModalRoot.js.map +1 -1
  205. package/dist/cssm/components/Panel/Panel.js +1 -1
  206. package/dist/cssm/components/Panel/Panel.js.map +1 -1
  207. package/dist/cssm/components/PanelHeaderContent/PanelHeaderContent.css +1 -1
  208. package/dist/cssm/components/PanelHeaderContent/PanelHeaderContent.js +0 -1
  209. package/dist/cssm/components/PanelHeaderContent/PanelHeaderContent.js.map +1 -1
  210. package/dist/cssm/components/PullToRefresh/PullToRefresh.js +1 -1
  211. package/dist/cssm/components/PullToRefresh/PullToRefresh.js.map +1 -1
  212. package/dist/cssm/components/RangeSlider/UniversalSlider.js +1 -1
  213. package/dist/cssm/components/RangeSlider/UniversalSlider.js.map +1 -1
  214. package/dist/cssm/components/Root/Root.js +152 -207
  215. package/dist/cssm/components/Root/Root.js.map +1 -1
  216. package/dist/cssm/components/Search/Search.js +1 -1
  217. package/dist/cssm/components/Search/Search.js.map +1 -1
  218. package/dist/cssm/components/SimpleCell/SimpleCell.js.map +1 -1
  219. package/dist/cssm/components/SimpleCheckbox/SimpleCheckbox.css +1 -0
  220. package/dist/cssm/components/SimpleCheckbox/SimpleCheckbox.js +98 -0
  221. package/dist/cssm/components/SimpleCheckbox/SimpleCheckbox.js.map +1 -0
  222. package/dist/cssm/components/Snackbar/Snackbar.js +1 -1
  223. package/dist/cssm/components/Snackbar/Snackbar.js.map +1 -1
  224. package/dist/cssm/components/Tappable/Tappable.js +45 -37
  225. package/dist/cssm/components/Tappable/Tappable.js.map +1 -1
  226. package/dist/cssm/components/Touch/Touch.js +163 -286
  227. package/dist/cssm/components/Touch/Touch.js.map +1 -1
  228. package/dist/cssm/components/UsersStack/UsersStack.css +1 -1
  229. package/dist/cssm/components/UsersStack/UsersStack.js +7 -16
  230. package/dist/cssm/components/UsersStack/UsersStack.js.map +1 -1
  231. package/dist/cssm/components/UsersStack/masks.js +6 -9
  232. package/dist/cssm/components/UsersStack/masks.js.map +1 -1
  233. package/dist/cssm/components/View/View.js +1 -1
  234. package/dist/cssm/components/View/View.js.map +1 -1
  235. package/dist/cssm/components/View/ViewInfinite.js +1 -1
  236. package/dist/cssm/components/View/ViewInfinite.js.map +1 -1
  237. package/dist/cssm/hooks/useEventListener.js +8 -4
  238. package/dist/cssm/hooks/useEventListener.js.map +1 -1
  239. package/dist/cssm/hooks/useGlobalEventListener.js +2 -2
  240. package/dist/cssm/hooks/useGlobalEventListener.js.map +1 -1
  241. package/dist/cssm/hooks/useInsets.js +2 -10
  242. package/dist/cssm/hooks/useInsets.js.map +1 -1
  243. package/dist/cssm/hooks/useKeyboard.js +62 -0
  244. package/dist/cssm/hooks/useKeyboard.js.map +1 -0
  245. package/dist/cssm/hooks/useKeyboardInputTracker.js +4 -2
  246. package/dist/cssm/hooks/useKeyboardInputTracker.js.map +1 -1
  247. package/dist/cssm/index.js +1 -1
  248. package/dist/cssm/index.js.map +1 -1
  249. package/dist/cssm/lib/select.js +62 -0
  250. package/dist/cssm/lib/select.js.map +1 -0
  251. package/dist/cssm/lib/touch.js +5 -2
  252. package/dist/cssm/lib/touch.js.map +1 -1
  253. package/dist/cssm/lib/utils.js.map +1 -1
  254. package/dist/cssm/styles/animations.css +1 -1
  255. package/dist/cssm/styles/common.css +1 -1
  256. package/dist/cssm/styles/components.css +1 -1
  257. package/dist/cssm/styles/constants.css +1 -1
  258. package/dist/cssm/styles/unstable.css +1 -1
  259. package/dist/cssm/unstable/index.js +1 -0
  260. package/dist/cssm/unstable/index.js.map +1 -1
  261. package/dist/hooks/useEventListener.d.ts +2 -2
  262. package/dist/hooks/useEventListener.js +8 -4
  263. package/dist/hooks/useEventListener.js.map +1 -1
  264. package/dist/hooks/useGlobalEventListener.js +2 -2
  265. package/dist/hooks/useGlobalEventListener.js.map +1 -1
  266. package/dist/hooks/useInsets.js +2 -10
  267. package/dist/hooks/useInsets.js.map +1 -1
  268. package/dist/hooks/useKeyboard.d.ts +11 -0
  269. package/dist/hooks/useKeyboard.js +62 -0
  270. package/dist/hooks/useKeyboard.js.map +1 -0
  271. package/dist/hooks/useKeyboardInputTracker.js +4 -2
  272. package/dist/hooks/useKeyboardInputTracker.js.map +1 -1
  273. package/dist/index.d.ts +1 -1
  274. package/dist/index.js +1 -1
  275. package/dist/index.js.map +1 -1
  276. package/dist/lib/select.d.ts +7 -0
  277. package/dist/lib/select.js +62 -0
  278. package/dist/lib/select.js.map +1 -0
  279. package/dist/lib/touch.d.ts +1 -1
  280. package/dist/lib/touch.js +5 -2
  281. package/dist/lib/touch.js.map +1 -1
  282. package/dist/lib/utils.d.ts +2 -3
  283. package/dist/lib/utils.js.map +1 -1
  284. package/dist/types.d.ts +2 -6
  285. package/dist/unstable/index.d.ts +2 -0
  286. package/dist/unstable/index.js +1 -0
  287. package/dist/unstable/index.js.map +1 -1
  288. package/dist/unstable.css +1 -1
  289. package/dist/unstable.css.map +1 -1
  290. package/dist/vkui.css +1 -1
  291. package/dist/vkui.css.map +1 -1
  292. package/package.json +4 -2
  293. package/postcss.config.js +1 -1
  294. package/src/components/ActionSheetItem/ActionSheetItem.css +4 -8
  295. package/src/components/AppRoot/AppRoot.css +20 -0
  296. package/src/components/AppRoot/AppRoot.tsx +30 -0
  297. package/src/components/Banner/Banner.css +4 -0
  298. package/src/components/Banner/Banner.tsx +1 -1
  299. package/src/components/Cell/Cell.tsx +1 -1
  300. package/src/components/ChipsSelect/ChipsSelect.tsx +4 -7
  301. package/src/components/ChipsSelect/Readme.md +0 -2
  302. package/src/components/ChipsSelect/useChipsSelect.ts +1 -1
  303. package/src/components/CustomSelect/CustomSelect.tsx +3 -2
  304. package/src/components/FixedLayout/FixedLayout.tsx +61 -147
  305. package/src/components/Gallery/Gallery.tsx +1 -1
  306. package/src/components/Header/Header.tsx +1 -1
  307. package/src/components/ModalCardBase/ModalCardBase.css +4 -0
  308. package/src/components/ModalCardBase/ModalCardBase.tsx +5 -1
  309. package/src/components/ModalPage/ModalPage.tsx +1 -2
  310. package/src/components/ModalRoot/ModalRoot.css +10 -0
  311. package/src/components/ModalRoot/ModalRoot.tsx +1 -1
  312. package/src/components/Panel/Panel.tsx +1 -1
  313. package/src/components/PanelHeaderContent/PanelHeaderContent.css +2 -1
  314. package/src/components/PanelHeaderContent/PanelHeaderContent.tsx +2 -2
  315. package/src/components/PullToRefresh/PullToRefresh.tsx +1 -1
  316. package/src/components/RangeSlider/UniversalSlider.tsx +1 -1
  317. package/src/components/Root/Readme.md +27 -37
  318. package/src/components/Root/Root.tsx +112 -191
  319. package/src/components/Search/Search.tsx +1 -1
  320. package/src/components/Separator/Readme.md +3 -1
  321. package/src/components/SimpleCell/SimpleCell.tsx +1 -1
  322. package/src/components/SimpleCheckbox/Readme.md +17 -0
  323. package/src/components/SimpleCheckbox/SimpleCheckbox.css +115 -0
  324. package/src/components/SimpleCheckbox/SimpleCheckbox.tsx +105 -0
  325. package/src/components/Snackbar/Snackbar.tsx +1 -1
  326. package/src/components/Tappable/Tappable.tsx +28 -37
  327. package/src/components/Touch/Touch.tsx +100 -238
  328. package/src/components/UsersStack/UsersStack.css +5 -9
  329. package/src/components/UsersStack/UsersStack.tsx +4 -11
  330. package/src/components/UsersStack/masks.tsx +6 -9
  331. package/src/components/View/Readme.md +34 -42
  332. package/src/components/View/View.tsx +1 -1
  333. package/src/components/View/ViewInfinite.tsx +1 -1
  334. package/src/hooks/useEventListener.ts +11 -8
  335. package/src/hooks/useGlobalEventListener.ts +2 -2
  336. package/src/hooks/useInsets.ts +2 -8
  337. package/src/hooks/useKeyboard.ts +67 -0
  338. package/src/hooks/useKeyboardInputTracker.ts +4 -2
  339. package/src/index.ts +1 -1
  340. package/src/lib/select.ts +53 -0
  341. package/src/lib/touch.ts +2 -2
  342. package/src/lib/utils.ts +3 -4
  343. package/src/styles/animations.css +0 -14
  344. package/src/styles/common.css +0 -21
  345. package/src/styles/components.css +2 -0
  346. package/src/styles/constants.css +3 -0
  347. package/src/styles/unstable.css +1 -0
  348. package/src/types.ts +2 -8
  349. package/src/unstable/index.ts +3 -0
@@ -0,0 +1,105 @@
1
+ import * as React from 'react';
2
+ import Tappable, { ACTIVE_EFFECT_DELAY } from '../Tappable/Tappable';
3
+ import { getClassName } from '../../helpers/getClassName';
4
+ import { classNames } from '../../lib/classNames';
5
+ import { IOS, VKCOM } from '../../lib/platform';
6
+
7
+ import { Icon20CheckBoxOn, Icon20CheckBoxOff, Icon24CheckBoxOn, Icon24CheckBoxOff, Icon20CheckBoxIndetermanate } from '@vkontakte/icons';
8
+
9
+ import { HasRef, HasRootRef } from '../../types';
10
+ import { usePlatform } from '../../hooks/usePlatform';
11
+ import { useAdaptivity } from '../../hooks/useAdaptivity';
12
+ import { useExternRef } from '../../hooks/useExternRef';
13
+ import { SizeType } from '../../hoc/withAdaptivity';
14
+ import { warnOnce } from '../../lib/warnOnce';
15
+
16
+ import './SimpleCheckbox.css';
17
+
18
+ const warn = warnOnce('SimpleCheckbox');
19
+ const IS_DEV = process.env.NODE_ENV === 'development';
20
+
21
+ export interface SimpleCheckboxProps extends
22
+ React.InputHTMLAttributes<HTMLInputElement>,
23
+ HasRootRef<HTMLLabelElement>,
24
+ HasRef<HTMLInputElement> {
25
+ indeterminate?: boolean;
26
+ defaultIndeterminate?: boolean;
27
+ }
28
+
29
+ export const SimpleCheckbox: React.FC<SimpleCheckboxProps> = (props: SimpleCheckboxProps) => {
30
+ const { className, style, getRootRef, getRef, indeterminate, defaultIndeterminate, onChange, ...restProps } = props;
31
+ const { sizeY } = useAdaptivity();
32
+ const platform = usePlatform();
33
+ const inputRef = useExternRef(getRef);
34
+
35
+ React.useEffect(() => {
36
+ const indeterminateValue = indeterminate === undefined ? defaultIndeterminate : indeterminate;
37
+
38
+ if (inputRef.current) {
39
+ inputRef.current.indeterminate = indeterminateValue;
40
+ }
41
+ }, [indeterminate]);
42
+
43
+ const handleChange: SimpleCheckboxProps['onChange'] = React.useCallback((event) => {
44
+ if (defaultIndeterminate !== undefined && indeterminate === undefined && restProps.checked === undefined) {
45
+ inputRef.current.indeterminate = false;
46
+ }
47
+ if (indeterminate !== undefined) {
48
+ inputRef.current.indeterminate = indeterminate;
49
+ }
50
+ onChange && onChange(event);
51
+ }, [onChange, indeterminate, restProps.checked]);
52
+
53
+ if (IS_DEV) {
54
+ if (defaultIndeterminate && restProps.defaultChecked) {
55
+ warn('defaultIndeterminate and defaultChecked cannot be true at the same time');
56
+ }
57
+
58
+ if (indeterminate && restProps.checked) {
59
+ warn('indeterminate and checked cannot be true at the same time');
60
+ }
61
+ }
62
+
63
+ return (
64
+ <Tappable
65
+ Component="label"
66
+ vkuiClass={classNames(
67
+ getClassName('SimpleCheckbox', platform),
68
+ `SimpleCheckbox--sizeY-${sizeY}`,
69
+ )}
70
+ className={className}
71
+ style={style}
72
+ disabled={restProps.disabled}
73
+ activeMode={platform === VKCOM ? 'SimpleCheckbox--active' : 'background'}
74
+ hoverMode={platform === VKCOM ? 'SimpleCheckbox--hover' : 'background'}
75
+ activeEffectDelay={platform === IOS ? 100 : ACTIVE_EFFECT_DELAY}
76
+ getRootRef={getRootRef}
77
+ >
78
+ <input {...restProps} onChange={handleChange} type="checkbox" vkuiClass="SimpleCheckbox__input" ref={inputRef} />
79
+ <div vkuiClass="SimpleCheckbox__container">
80
+ <div vkuiClass="SimpleCheckbox__icon SimpleCheckbox__icon--on">
81
+ {sizeY === SizeType.COMPACT || platform === VKCOM
82
+ ? <Icon20CheckBoxOn />
83
+ : <Icon24CheckBoxOn />
84
+ }
85
+ </div>
86
+ <div vkuiClass="SimpleCheckbox__icon SimpleCheckbox__icon--off">
87
+ {sizeY === SizeType.COMPACT || platform === VKCOM
88
+ ? <Icon20CheckBoxOff />
89
+ : <Icon24CheckBoxOff />
90
+ }
91
+ </div>
92
+ <div vkuiClass="SimpleCheckbox__icon SimpleCheckbox__icon--indeterminate">
93
+ <Icon20CheckBoxIndetermanate
94
+ width={sizeY === SizeType.COMPACT || platform === VKCOM ? 20 : 24}
95
+ height={sizeY === SizeType.COMPACT || platform === VKCOM ? 20 : 24}
96
+ />
97
+ </div>
98
+ </div>
99
+ {platform === VKCOM && <div aria-hidden={true} vkuiClass="SimpleCheckbox__activeShadow" />}
100
+ {platform === VKCOM && <div aria-hidden={true} vkuiClass="SimpleCheckbox__hoverShadow" />}
101
+ </Tappable>
102
+ );
103
+ };
104
+
105
+ export default SimpleCheckbox;
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import Touch, { TouchEvent } from '../Touch/Touch';
2
+ import { Touch, TouchEvent } from '../Touch/Touch';
3
3
  import { classNames } from '../../lib/classNames';
4
4
  import { HasPlatform } from '../../types';
5
5
  import { getClassName } from '../../helpers/getClassName';
@@ -1,18 +1,19 @@
1
1
  import * as React from 'react';
2
- import Touch, { TouchEvent, TouchEventHandler, TouchProps } from '../Touch/Touch';
2
+ import { Touch, TouchEvent, TouchEventHandler, TouchProps } from '../Touch/Touch';
3
3
  import TouchRootContext from '../Touch/TouchContext';
4
4
  import { classNames } from '../../lib/classNames';
5
5
  import { getClassName } from '../../helpers/getClassName';
6
6
  import { ANDROID } from '../../lib/platform';
7
7
  import { getOffsetRect } from '../../lib/offset';
8
8
  import { coordX, coordY, VKUITouchEvent, VKUITouchEventHander } from '../../lib/touch';
9
- import { HasPlatform, HasRootRef, Ref } from '../../types';
9
+ import { HasPlatform, HasRootRef } from '../../types';
10
10
  import { withPlatform } from '../../hoc/withPlatform';
11
11
  import { hasHover } from '@vkontakte/vkjs';
12
12
  import { setRef } from '../../lib/utils';
13
13
  import { withAdaptivity, AdaptivityProps } from '../../hoc/withAdaptivity';
14
14
  import { shouldTriggerClickOnEnterOrSpace } from '../../lib/accessibility';
15
15
  import { FocusVisible, FocusVisibleMode } from '../FocusVisible/FocusVisible';
16
+ import { useTimeout } from '../../hooks/useTimeout';
16
17
  import './Tappable.css';
17
18
 
18
19
  export interface TappableProps extends React.AllHTMLAttributes<HTMLElement>, HasRootRef<HTMLElement>, HasPlatform, AdaptivityProps {
@@ -44,13 +45,14 @@ export interface TappableProps extends React.AllHTMLAttributes<HTMLElement>, Has
44
45
  focusVisibleMode?: FocusVisibleMode;
45
46
  }
46
47
 
48
+ interface Wave {
49
+ x: number;
50
+ y: number;
51
+ id: string;
52
+ }
53
+
47
54
  export interface TappableState {
48
- clicks?: {
49
- [index: string]: {
50
- x: number;
51
- y: number;
52
- };
53
- };
55
+ clicks?: Wave[];
54
56
  hovered?: boolean;
55
57
  active?: boolean;
56
58
  ts?: number;
@@ -59,7 +61,7 @@ export interface TappableState {
59
61
  }
60
62
 
61
63
  export interface RootComponentProps extends TouchProps {
62
- ref?: Ref<HTMLElement>;
64
+ ref?: React.Ref<HTMLElement>;
63
65
  }
64
66
 
65
67
  export interface StorageItem {
@@ -101,7 +103,7 @@ class Tappable extends React.Component<TappableProps, TappableState> {
101
103
  super(props);
102
104
  this.id = Math.round(Math.random() * 1e8).toString(16);
103
105
  this.state = {
104
- clicks: {},
106
+ clicks: [],
105
107
  active: false,
106
108
  ts: null,
107
109
  hasHover: props.hasHover,
@@ -120,8 +122,6 @@ class Tappable extends React.Component<TappableProps, TappableState> {
120
122
 
121
123
  timeout: ReturnType<typeof setTimeout>;
122
124
 
123
- wavesTimeout: ReturnType<typeof setTimeout>;
124
-
125
125
  static defaultProps = {
126
126
  stopPropagation: false,
127
127
  disabled: false,
@@ -240,27 +240,10 @@ class Tappable extends React.Component<TappableProps, TappableState> {
240
240
  const { top, left } = getOffsetRect(this.container);
241
241
  const x = coordX(e) - left;
242
242
  const y = coordY(e) - top;
243
- const key = 'wave' + Date.now().toString();
244
-
245
- this.setState((state: TappableState): TappableState => {
246
- return {
247
- clicks: {
248
- ...state.clicks,
249
- [key]: {
250
- x,
251
- y,
252
- },
253
- },
254
- };
255
- });
256
243
 
257
- this.wavesTimeout = setTimeout(() => {
258
- this.setState((state: TappableState): TappableState => {
259
- let clicks = { ...state.clicks };
260
- delete clicks[key];
261
- return { clicks };
262
- });
263
- }, 225);
244
+ this.setState({
245
+ clicks: [...this.state.clicks, { x, y, id: Date.now().toString() }],
246
+ });
264
247
  }
265
248
  };
266
249
 
@@ -323,8 +306,6 @@ class Tappable extends React.Component<TappableProps, TappableState> {
323
306
 
324
307
  delete storage[this.id];
325
308
  }
326
-
327
- clearTimeout(this.wavesTimeout);
328
309
  }
329
310
 
330
311
  componentDidUpdate(prevProps: TappableProps) {
@@ -336,6 +317,10 @@ class Tappable extends React.Component<TappableProps, TappableState> {
336
317
  }
337
318
  }
338
319
 
320
+ removeWave(id: Wave['id']) {
321
+ this.setState({ clicks: this.state.clicks.filter((c) => c.id !== id) });
322
+ }
323
+
339
324
  render() {
340
325
  const { clicks, active, hovered, hasHover, hasActive } = this.state;
341
326
 
@@ -440,12 +425,12 @@ class Tappable extends React.Component<TappableProps, TappableState> {
440
425
  </TappableContext.Provider>
441
426
  {platform === ANDROID && !hasMouse && hasActive && activeMode === 'background' && (
442
427
  <span aria-hidden="true" vkuiClass="Tappable__waves">
443
- {Object.keys(clicks).map((k: string) => (
444
- <span vkuiClass="Tappable__wave" style={{ top: clicks[k].y, left: clicks[k].x }} key={k} />
428
+ {clicks.map((wave) => (
429
+ <Wave {...wave} key={wave.id} onClear={() => this.removeWave(wave.id)} />
445
430
  ))}
446
431
  </span>
447
432
  )}
448
- {hasHover && <span aria-hidden="true" vkuiClass="Tappable__hoverShadow" />}
433
+ {hasHover && hoverMode === 'background' && <span aria-hidden="true" vkuiClass="Tappable__hoverShadow" />}
449
434
  {!restProps.disabled && <FocusVisible mode={focusVisibleMode} />}
450
435
  </RootComponent>
451
436
  );
@@ -459,3 +444,9 @@ class Tappable extends React.Component<TappableProps, TappableState> {
459
444
  }
460
445
 
461
446
  export default withAdaptivity(withPlatform(Tappable), { sizeX: true, hasMouse: true });
447
+
448
+ function Wave({ x, y, onClear }: Wave & { onClear: VoidFunction }) {
449
+ const timeout = useTimeout(onClear, 225);
450
+ React.useEffect(() => timeout.set(), []);
451
+ return <span vkuiClass="Tappable__wave" style={{ top: y, left: x }} />;
452
+ }
@@ -1,15 +1,10 @@
1
1
  import * as React from 'react';
2
- import {
3
- getSupportedEvents,
4
- coordX,
5
- coordY,
6
- touchEnabled,
7
- VKUITouchEvent,
8
- VKUITouchEventHander,
9
- } from '../../lib/touch';
2
+ import { getSupportedEvents, coordX, coordY, touchEnabled, VKUITouchEvent } from '../../lib/touch';
10
3
  import { HasRootRef } from '../../types';
11
- import { canUseDOM, DOMProps, withDOM } from '../../lib/dom';
12
- import { setRef, noop } from '../../lib/utils';
4
+ import { useDOM } from '../../lib/dom';
5
+ import { useExternRef } from '../../hooks/useExternRef';
6
+ import { useEventListener } from '../../hooks/useEventListener';
7
+ import { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';
13
8
 
14
9
  export interface TouchProps extends React.AllHTMLAttributes<HTMLElement>, HasRootRef<HTMLElement> {
15
10
  onEnter?(outputEvent: MouseEvent): void;
@@ -52,110 +47,58 @@ export type TouchEventHandler = (e: TouchEvent) => void;
52
47
  export type ClickHandler = (e: React.MouseEvent<HTMLElement>) => void;
53
48
  export type DragHandler = (e: React.DragEvent<HTMLElement>) => void;
54
49
 
55
- const events = getSupportedEvents();
56
-
57
- class Touch extends React.Component<TouchProps & DOMProps> {
58
- didSlide = false;
59
- gesture: Partial<Gesture> = {};
60
- container: HTMLElement;
61
-
62
- static defaultProps: TouchProps = {
63
- Component: 'div',
64
- children: '',
65
- useCapture: false,
66
- noSlideClick: false,
67
- };
68
-
69
- get document() {
70
- return this.props.document;
71
- }
72
-
73
- componentDidMount() {
74
- if (canUseDOM) {
75
- this.container.addEventListener(events[0], this.onStart, { capture: this.props.useCapture, passive: false });
76
- touchEnabled && this.subscribe(this.container);
77
-
78
- this.container.addEventListener('mouseenter', this.onEnter, { capture: this.props.useCapture, passive: true });
79
- this.container.addEventListener('mouseleave', this.onLeave, { capture: this.props.useCapture, passive: true });
80
- }
81
- }
82
-
83
- componentWillUnmount() {
84
- this.container.removeEventListener(events[0], this.onStart);
85
- this.unsubscribe();
86
-
87
- this.container.removeEventListener('mouseenter', this.onEnter);
88
- this.container.removeEventListener('mouseleave', this.onLeave);
89
- }
90
-
91
- /**
92
- * Обработчик событий mouseenter
93
- *
94
- * @param {Object} e Браузерное событие
95
- * @return {void}
96
- */
97
- onEnter = (e: MouseEvent) => {
98
- if (this.props.onEnter) {
99
- this.props.onEnter(e);
100
- }
101
- };
102
-
103
- /**
104
- * Обработчик событий mouseleave
105
- *
106
- * @param {Object} e Браузерное событие
107
- * @param {boolean} simulated флаг, с которым обработчик был вызван симулятивно
108
- * @return {void}
109
- */
110
- onLeave = (e: MouseEvent) => {
111
- if (this.props.onLeave) {
112
- this.props.onLeave(e);
113
- }
114
- };
115
-
116
- /**
117
- * Обработчик событий touchstart
118
- *
119
- * @param {Object} e Браузерное событие
120
- * @return {void}
121
- */
122
- onStart: VKUITouchEventHander = (e: VKUITouchEvent) => {
123
- this.gesture = {
50
+ export const Touch: React.FC<TouchProps> = ({
51
+ onStart,
52
+ onStartX,
53
+ onStartY,
54
+ onMove: _onMove,
55
+ onMoveX,
56
+ onMoveY,
57
+ onLeave,
58
+ onEnter,
59
+ onEnd: _onEnd,
60
+ onEndX,
61
+ onEndY,
62
+ onClickCapture,
63
+ useCapture = false,
64
+ Component = 'div',
65
+ getRootRef,
66
+ noSlideClick = false,
67
+ ...restProps
68
+ }) => {
69
+ const { document } = useDOM();
70
+ const events = React.useMemo(getSupportedEvents, []);
71
+ const didSlide = React.useRef(false);
72
+ const gesture = React.useRef<Partial<Gesture>>({});
73
+ const handle = (e: any, handers: any[]) => handers.forEach((cb) => {
74
+ cb && cb({ ...gesture.current, originalEvent: e });
75
+ });
76
+
77
+ const mouseEnterHandler = useEventListener('mouseenter', onEnter);
78
+ const mouseLeaveHandler = useEventListener('mouseleave', onLeave);
79
+ const startHandler = useEventListener(events[0], (e: VKUITouchEvent) => {
80
+ gesture.current = {
124
81
  startX: coordX(e),
125
82
  startY: coordY(e),
126
83
  startT: new Date(),
127
84
  isPressed: true,
128
85
  };
129
86
 
130
- // Вызываем нужные колбеки из props
131
- const outputEvent = {
132
- ...this.gesture,
133
- originalEvent: e,
134
- };
135
-
136
- if (this.props.onStart) {
137
- this.props.onStart(outputEvent);
138
- }
139
-
140
- if (this.props.onStartX) {
141
- this.props.onStartX(outputEvent);
142
- }
143
-
144
- if (this.props.onStartY) {
145
- this.props.onStartY(outputEvent);
146
- }
87
+ handle(e, [onStart, onStartX, onStartY]);
88
+ !touchEnabled() && subscribe(document);
89
+ }, { capture: useCapture, passive: false });
90
+ const containerRef = useExternRef(getRootRef);
147
91
 
148
- !touchEnabled && this.subscribe(this.document);
149
- };
92
+ useIsomorphicLayoutEffect(() => {
93
+ const el = containerRef.current;
94
+ mouseEnterHandler.add(el);
95
+ mouseLeaveHandler.add(el);
96
+ startHandler.add(el);
97
+ touchEnabled() && subscribe(el);
98
+ }, [Component]);
150
99
 
151
- /**
152
- * Обработчик событий touchmove
153
- *
154
- * @param {Object} e Браузерное событие
155
- * @return {void}
156
- */
157
- onMove: VKUITouchEventHander = (e: VKUITouchEvent) => {
158
- const { isPressed, isX, isY, startX, startY } = this.gesture;
100
+ function onMove(e: VKUITouchEvent) {
101
+ const { isPressed, isX, isY, startX, startY } = gesture.current;
159
102
 
160
103
  if (isPressed) {
161
104
  // смещения
@@ -168,116 +111,71 @@ class Touch extends React.Component<TouchProps & DOMProps> {
168
111
 
169
112
  // Если определяем мультитач, то прерываем жест
170
113
  if (!!e.touches && e.touches.length > 1) {
171
- return this.onEnd(e);
114
+ return onEnd(e);
172
115
  }
173
116
 
174
117
  // если мы ещё не определились
175
118
  if (!isX && !isY) {
176
- let willBeX = shiftXAbs >= 5 && shiftXAbs > shiftYAbs;
177
- let willBeY = shiftYAbs >= 5 && shiftYAbs > shiftXAbs;
178
- let willBeSlidedX = willBeX && !!this.props.onMoveX || !!this.props.onMove;
179
- let willBeSlidedY = willBeY && !!this.props.onMoveY || !!this.props.onMove;
180
-
181
- this.gesture.isY = willBeY;
182
- this.gesture.isX = willBeX;
183
- this.gesture.isSlideX = willBeSlidedX;
184
- this.gesture.isSlideY = willBeSlidedY;
185
- this.gesture.isSlide = willBeSlidedX || willBeSlidedY;
119
+ const willBeX = shiftXAbs >= 5 && shiftXAbs > shiftYAbs;
120
+ const willBeY = shiftYAbs >= 5 && shiftYAbs > shiftXAbs;
121
+ const willBeSlidedX = willBeX && (!!onMoveX || !!_onMove);
122
+ const willBeSlidedY = willBeY && (!!onMoveY || !!_onMove);
123
+
124
+ Object.assign(gesture.current, {
125
+ isY: willBeY,
126
+ isX: willBeX,
127
+ isSlideX: willBeSlidedX,
128
+ isSlideY: willBeSlidedY,
129
+ isSlide: willBeSlidedX || willBeSlidedY,
130
+ });
186
131
  }
187
132
 
188
- if (this.gesture.isSlide) {
189
- this.gesture.shiftX = shiftX;
190
- this.gesture.shiftY = shiftY;
191
- this.gesture.shiftXAbs = shiftXAbs;
192
- this.gesture.shiftYAbs = shiftYAbs;
193
-
194
- // Вызываем нужные колбеки из props
195
- const outputEvent: TouchEvent = {
196
- ...this.gesture,
197
- originalEvent: e,
198
- };
133
+ if (gesture.current.isSlide) {
134
+ Object.assign(gesture.current, {
135
+ shiftX,
136
+ shiftY,
137
+ shiftXAbs,
138
+ shiftYAbs,
139
+ });
199
140
 
200
- if (this.props.onMove) {
201
- this.props.onMove(outputEvent);
202
- }
203
-
204
- if (this.gesture.isSlideX && this.props.onMoveX) {
205
- this.props.onMoveX(outputEvent);
206
- }
207
-
208
- if (this.gesture.isSlideY && this.props.onMoveY) {
209
- this.props.onMoveY(outputEvent);
210
- }
141
+ handle(e, [_onMove, gesture.current.isSlideX && onMoveX, gesture.current.isSlideY && onMoveY]);
211
142
  }
212
143
  }
213
- };
144
+ }
214
145
 
215
- /**
216
- * Обработчик событий touchend, touchcancel
217
- *
218
- * @param {Object} e Браузерное событие
219
- * @return {void}
220
- */
221
- onEnd: VKUITouchEventHander = (e: VKUITouchEvent) => {
222
- const { isPressed, isSlide, isSlideX, isSlideY } = this.gesture;
146
+ function onEnd(e: VKUITouchEvent) {
147
+ const { isPressed, isSlide, isSlideX, isSlideY } = gesture.current;
223
148
 
224
149
  if (isPressed) {
225
- // Вызываем нужные колбеки из props
226
- const outputEvent: TouchEvent = {
227
- ...this.gesture,
228
- originalEvent: e,
229
- };
230
-
231
- if (this.props.onEnd) {
232
- this.props.onEnd(outputEvent);
233
- }
234
-
235
- if (isSlideY && this.props.onEndY) {
236
- this.props.onEndY(outputEvent);
237
- }
238
-
239
- if (isSlideX && this.props.onEndX) {
240
- this.props.onEndX(outputEvent);
241
- }
150
+ handle(e, [_onEnd, isSlideY && onEndY, isSlideX && onEndX]);
242
151
  }
243
152
 
244
- this.didSlide = isSlide;
245
- this.gesture = {};
153
+ didSlide.current = isSlide;
154
+ gesture.current = {};
246
155
 
247
156
  // Если это был тач-евент, симулируем отмену hover
248
157
  if (e.type === 'touchend' || e.type === 'touchcancel') {
249
- this.onLeave(e);
158
+ onLeave && onLeave(e);
250
159
  }
251
160
 
252
- !touchEnabled && this.unsubscribe();
253
- };
161
+ !touchEnabled() && subscribe(null);
162
+ }
254
163
 
255
- subscribe(element: HTMLElement | Document) {
256
- this.unsubscribe();
257
- const listenerParams = { capture: this.props.useCapture, passive: false };
258
- element.addEventListener(events[1], this.onMove, listenerParams);
259
- element.addEventListener(events[2], this.onEnd, listenerParams);
260
- element.addEventListener(events[3], this.onEnd, listenerParams);
261
- this.unsubscribe = () => {
262
- // Здесь нужен последний аргумент с такими же параметрами, потому что
263
- // некоторые браузеры на странных вендорах типа Meizu не удаляют обработчик.
264
- // https://github.com/VKCOM/VKUI/issues/444
265
- element.removeEventListener(events[1], this.onMove, listenerParams);
266
- element.removeEventListener(events[2], this.onEnd, listenerParams);
267
- element.removeEventListener(events[3], this.onEnd, listenerParams);
268
- this.unsubscribe = noop;
269
- };
164
+ const listenerParams = { capture: useCapture, passive: false };
165
+ const listeners = [
166
+ useEventListener(events[1], onMove, listenerParams),
167
+ useEventListener(events[2], onEnd, listenerParams),
168
+ useEventListener(events[3], onEnd, listenerParams),
169
+ ];
170
+ function subscribe(el: HTMLElement | Document | null) {
171
+ listeners.forEach((l) => l.add(el));
270
172
  }
271
- unsubscribe = noop;
272
173
 
273
174
  /**
274
175
  * Обработчик событий dragstart
275
176
  * Отменяет нативное браузерное поведение для вложенных ссылок и изображений
276
- *
277
- * @param {Object} e Браузерное событие
278
- * @return {void}
279
177
  */
280
- onDragStart: DragHandler = (e: React.DragEvent<HTMLElement>) => {
178
+ const onDragStart = (e: React.DragEvent<HTMLElement>) => {
281
179
  const target = e.target as HTMLElement;
282
180
  if (target.tagName === 'A' || target.tagName === 'IMG') {
283
181
  e.preventDefault();
@@ -287,13 +185,9 @@ class Touch extends React.Component<TouchProps & DOMProps> {
287
185
  /**
288
186
  * Обработчик клика по компоненту
289
187
  * Отменяет переход по вложенной ссылке, если был зафиксирован свайп
290
- *
291
- * @param {Object} e Браузерное событие
292
- * @return {void}
293
188
  */
294
- postGestureClick: ClickHandler = (e) => {
295
- const { onClickCapture, noSlideClick } = this.props;
296
- if (!this.didSlide) {
189
+ const postGestureClick: typeof onClickCapture = (e) => {
190
+ if (!didSlide.current) {
297
191
  return onClickCapture && onClickCapture(e);
298
192
  }
299
193
  if ((e.target as HTMLElement).tagName === 'A') {
@@ -304,47 +198,15 @@ class Touch extends React.Component<TouchProps & DOMProps> {
304
198
  } else {
305
199
  onClickCapture && onClickCapture(e);
306
200
  }
307
- this.didSlide = false;
308
- };
309
-
310
- getRef: React.RefCallback<HTMLElement> = (container) => {
311
- this.container = container;
312
- setRef(container, this.props.getRootRef);
201
+ didSlide.current = false;
313
202
  };
314
203
 
315
- render() {
316
- const {
317
- onStart,
318
- onStartX,
319
- onStartY,
320
- onMove,
321
- onMoveX,
322
- onMoveY,
323
- onLeave,
324
- onEnter,
325
- onEnd,
326
- onEndX,
327
- onEndY,
328
- useCapture,
329
- Component,
330
- getRootRef,
331
- noSlideClick,
332
- window,
333
- document,
334
- ...restProps
335
- } = this.props;
336
-
337
- return (
338
- <Component
339
- {...restProps}
340
- onDragStart={this.onDragStart}
341
- onClickCapture={this.postGestureClick}
342
- ref={this.getRef}
343
- >
344
- {this.props.children}
345
- </Component>
346
- );
347
- }
348
- }
349
-
350
- export default withDOM<TouchProps>(Touch);
204
+ return (
205
+ <Component
206
+ {...restProps}
207
+ onDragStart={onDragStart}
208
+ onClickCapture={postGestureClick}
209
+ ref={containerRef}
210
+ />
211
+ );
212
+ };