@vkontakte/vkui 4.20.0 → 4.22.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 (520) hide show
  1. package/.cache/.eslintcache +1 -1
  2. package/.cache/.stylelintcache +1 -1
  3. package/.cache/.tsbuildinfo +414 -116
  4. package/.cache/ts/src/components/Avatar/Avatar.d.ts +2 -0
  5. package/.cache/ts/src/components/Cell/Cell.d.ts +11 -0
  6. package/.cache/ts/src/components/Cell/CellCheckbox/CellCheckbox.d.ts +5 -0
  7. package/.cache/ts/src/components/Cell/CellDragger/CellDragger.d.ts +6 -0
  8. package/.cache/ts/src/components/Cell/useDraggable.d.ts +13 -0
  9. package/.cache/ts/src/components/CustomSelect/CustomSelect.d.ts +0 -1
  10. package/.cache/ts/src/components/DropdownIcon/DropdownIcon.d.ts +3 -0
  11. package/.cache/ts/src/components/FocusTrap/FocusTrap.d.ts +2 -3
  12. package/.cache/ts/src/components/FormField/FormField.d.ts +2 -3
  13. package/.cache/ts/src/components/FormItem/FormItem.d.ts +2 -3
  14. package/.cache/ts/src/components/FormLayout/FormLayout.d.ts +2 -4
  15. package/.cache/ts/src/components/GridAvatar/GridAvatar.d.ts +9 -0
  16. package/.cache/ts/src/components/HorizontalCell/HorizontalCell.d.ts +2 -3
  17. package/.cache/ts/src/components/HorizontalScroll/HorizontalScroll.d.ts +3 -2
  18. package/.cache/ts/src/components/InitialsAvatar/InitialsAvatar.d.ts +33 -0
  19. package/.cache/ts/src/components/Link/Link.d.ts +1 -2
  20. package/.cache/ts/src/components/ModalRoot/types.d.ts +0 -1
  21. package/.cache/ts/src/components/ModalRoot/useModalManager.d.ts +37 -0
  22. package/.cache/ts/src/components/Removable/Removable.d.ts +2 -1
  23. package/.cache/ts/src/components/SimpleCell/SimpleCell.d.ts +2 -2
  24. package/.cache/ts/src/components/SplitCol/SplitCol.d.ts +3 -3
  25. package/.cache/ts/src/components/SubnavigationBar/SubnavigationBar.d.ts +2 -1
  26. package/.cache/ts/src/components/Switch/Switch.d.ts +2 -3
  27. package/.cache/ts/src/components/TabbarItem/TabbarItem.d.ts +3 -1
  28. package/.cache/ts/src/components/Tappable/Tappable.d.ts +2 -3
  29. package/.cache/ts/src/components/Touch/Touch.d.ts +16 -17
  30. package/.cache/ts/src/components/Typography/Caption/Caption.d.ts +2 -2
  31. package/.cache/ts/src/components/Typography/Headline/Headline.d.ts +2 -2
  32. package/.cache/ts/src/components/Typography/Subhead/Subhead.d.ts +2 -2
  33. package/.cache/ts/src/components/Typography/Text/Text.d.ts +2 -3
  34. package/.cache/ts/src/components/Typography/Title/Title.d.ts +2 -2
  35. package/.cache/ts/src/components/View/utils.d.ts +2 -0
  36. package/.cache/ts/src/index.d.ts +4 -0
  37. package/.cache/ts/src/lib/accessibility.d.ts +1 -1
  38. package/.cache/ts/src/lib/supportEvents.d.ts +3 -1
  39. package/.cache/ts/src/types.d.ts +3 -0
  40. package/dist/cjs/components/ActionSheet/ActionSheet.js +7 -9
  41. package/dist/cjs/components/ActionSheet/ActionSheet.js.map +1 -1
  42. package/dist/cjs/components/Avatar/Avatar.d.ts +2 -0
  43. package/dist/cjs/components/Avatar/Avatar.js +7 -3
  44. package/dist/cjs/components/Avatar/Avatar.js.map +1 -1
  45. package/dist/cjs/components/Banner/Banner.js.map +1 -1
  46. package/dist/cjs/components/Button/Button.js.map +1 -1
  47. package/dist/cjs/components/CardScroll/CardScroll.js +1 -1
  48. package/dist/cjs/components/CardScroll/CardScroll.js.map +1 -1
  49. package/dist/cjs/components/Cell/Cell.d.ts +11 -0
  50. package/dist/cjs/components/Cell/Cell.js +109 -182
  51. package/dist/cjs/components/Cell/Cell.js.map +1 -1
  52. package/dist/cjs/components/Cell/CellCheckbox/CellCheckbox.d.ts +5 -0
  53. package/dist/cjs/components/Cell/CellCheckbox/CellCheckbox.js +50 -0
  54. package/dist/cjs/components/Cell/CellCheckbox/CellCheckbox.js.map +1 -0
  55. package/dist/cjs/components/Cell/CellDragger/CellDragger.d.ts +6 -0
  56. package/dist/cjs/components/Cell/CellDragger/CellDragger.js +53 -0
  57. package/dist/cjs/components/Cell/CellDragger/CellDragger.js.map +1 -0
  58. package/dist/cjs/components/Cell/useDraggable.d.ts +13 -0
  59. package/dist/cjs/components/Cell/useDraggable.js +142 -0
  60. package/dist/cjs/components/Cell/useDraggable.js.map +1 -0
  61. package/dist/cjs/components/ChipsSelect/ChipsSelect.js +2 -2
  62. package/dist/cjs/components/ChipsSelect/ChipsSelect.js.map +1 -1
  63. package/dist/cjs/components/Counter/Counter.js.map +1 -1
  64. package/dist/cjs/components/CustomSelect/CustomSelect.d.ts +0 -1
  65. package/dist/cjs/components/CustomSelect/CustomSelect.js +2 -3
  66. package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
  67. package/dist/cjs/components/DropdownIcon/DropdownIcon.d.ts +3 -0
  68. package/dist/cjs/components/DropdownIcon/DropdownIcon.js +37 -0
  69. package/dist/cjs/components/DropdownIcon/DropdownIcon.js.map +1 -0
  70. package/dist/cjs/components/FocusTrap/FocusTrap.d.ts +2 -3
  71. package/dist/cjs/components/FocusTrap/FocusTrap.js +3 -5
  72. package/dist/cjs/components/FocusTrap/FocusTrap.js.map +1 -1
  73. package/dist/cjs/components/FormField/FormField.d.ts +2 -3
  74. package/dist/cjs/components/FormField/FormField.js.map +1 -1
  75. package/dist/cjs/components/FormItem/FormItem.d.ts +2 -3
  76. package/dist/cjs/components/FormItem/FormItem.js.map +1 -1
  77. package/dist/cjs/components/FormLayout/FormLayout.d.ts +2 -4
  78. package/dist/cjs/components/FormLayout/FormLayout.js.map +1 -1
  79. package/dist/cjs/components/FormLayoutGroup/FormLayoutGroup.js +1 -0
  80. package/dist/cjs/components/FormLayoutGroup/FormLayoutGroup.js.map +1 -1
  81. package/dist/cjs/components/GridAvatar/GridAvatar.d.ts +9 -0
  82. package/dist/cjs/components/GridAvatar/GridAvatar.js +61 -0
  83. package/dist/cjs/components/GridAvatar/GridAvatar.js.map +1 -0
  84. package/dist/cjs/components/Header/Header.js.map +1 -1
  85. package/dist/cjs/components/HorizontalCell/HorizontalCell.d.ts +2 -3
  86. package/dist/cjs/components/HorizontalCell/HorizontalCell.js.map +1 -1
  87. package/dist/cjs/components/HorizontalScroll/HorizontalScroll.d.ts +3 -2
  88. package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js +10 -13
  89. package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  90. package/dist/cjs/components/InitialsAvatar/InitialsAvatar.d.ts +33 -0
  91. package/dist/cjs/components/InitialsAvatar/InitialsAvatar.js +64 -0
  92. package/dist/cjs/components/InitialsAvatar/InitialsAvatar.js.map +1 -0
  93. package/dist/cjs/components/Link/Link.d.ts +1 -2
  94. package/dist/cjs/components/Link/Link.js.map +1 -1
  95. package/dist/cjs/components/ModalRoot/ModalRoot.js +170 -373
  96. package/dist/cjs/components/ModalRoot/ModalRoot.js.map +1 -1
  97. package/dist/cjs/components/ModalRoot/ModalRootContext.js +0 -3
  98. package/dist/cjs/components/ModalRoot/ModalRootContext.js.map +1 -1
  99. package/dist/cjs/components/ModalRoot/ModalRootDesktop.js +59 -241
  100. package/dist/cjs/components/ModalRoot/ModalRootDesktop.js.map +1 -1
  101. package/dist/cjs/components/ModalRoot/types.d.ts +0 -1
  102. package/dist/cjs/components/ModalRoot/types.js.map +1 -1
  103. package/dist/cjs/components/ModalRoot/useModalManager.d.ts +37 -0
  104. package/dist/cjs/components/ModalRoot/useModalManager.js +213 -0
  105. package/dist/cjs/components/ModalRoot/useModalManager.js.map +1 -0
  106. package/dist/cjs/components/NativeSelect/NativeSelect.js +2 -2
  107. package/dist/cjs/components/NativeSelect/NativeSelect.js.map +1 -1
  108. package/dist/cjs/components/Removable/Removable.d.ts +2 -1
  109. package/dist/cjs/components/Removable/Removable.js +75 -66
  110. package/dist/cjs/components/Removable/Removable.js.map +1 -1
  111. package/dist/cjs/components/SelectMimicry/SelectMimicry.js +2 -2
  112. package/dist/cjs/components/SelectMimicry/SelectMimicry.js.map +1 -1
  113. package/dist/cjs/components/SimpleCell/SimpleCell.d.ts +2 -2
  114. package/dist/cjs/components/SimpleCell/SimpleCell.js.map +1 -1
  115. package/dist/cjs/components/SplitCol/SplitCol.d.ts +3 -3
  116. package/dist/cjs/components/SplitCol/SplitCol.js +2 -4
  117. package/dist/cjs/components/SplitCol/SplitCol.js.map +1 -1
  118. package/dist/cjs/components/SubnavigationBar/SubnavigationBar.d.ts +2 -1
  119. package/dist/cjs/components/SubnavigationBar/SubnavigationBar.js +38 -11
  120. package/dist/cjs/components/SubnavigationBar/SubnavigationBar.js.map +1 -1
  121. package/dist/cjs/components/SubnavigationButton/SubnavigationButton.js.map +1 -1
  122. package/dist/cjs/components/Switch/Switch.d.ts +2 -3
  123. package/dist/cjs/components/Switch/Switch.js +18 -8
  124. package/dist/cjs/components/Switch/Switch.js.map +1 -1
  125. package/dist/cjs/components/Tabbar/Tabbar.js +3 -1
  126. package/dist/cjs/components/Tabbar/Tabbar.js.map +1 -1
  127. package/dist/cjs/components/TabbarItem/TabbarItem.d.ts +3 -1
  128. package/dist/cjs/components/TabbarItem/TabbarItem.js +29 -11
  129. package/dist/cjs/components/TabbarItem/TabbarItem.js.map +1 -1
  130. package/dist/cjs/components/Tappable/Tappable.d.ts +2 -3
  131. package/dist/cjs/components/Tappable/Tappable.js.map +1 -1
  132. package/dist/cjs/components/Textarea/Textarea.js +9 -7
  133. package/dist/cjs/components/Textarea/Textarea.js.map +1 -1
  134. package/dist/cjs/components/Touch/Touch.d.ts +16 -17
  135. package/dist/cjs/components/Touch/Touch.js +21 -7
  136. package/dist/cjs/components/Touch/Touch.js.map +1 -1
  137. package/dist/cjs/components/Typography/Caption/Caption.d.ts +2 -2
  138. package/dist/cjs/components/Typography/Caption/Caption.js +4 -2
  139. package/dist/cjs/components/Typography/Caption/Caption.js.map +1 -1
  140. package/dist/cjs/components/Typography/Headline/Headline.d.ts +2 -2
  141. package/dist/cjs/components/Typography/Headline/Headline.js +2 -1
  142. package/dist/cjs/components/Typography/Headline/Headline.js.map +1 -1
  143. package/dist/cjs/components/Typography/Subhead/Subhead.d.ts +2 -2
  144. package/dist/cjs/components/Typography/Subhead/Subhead.js +2 -1
  145. package/dist/cjs/components/Typography/Subhead/Subhead.js.map +1 -1
  146. package/dist/cjs/components/Typography/Text/Text.d.ts +2 -3
  147. package/dist/cjs/components/Typography/Text/Text.js +2 -1
  148. package/dist/cjs/components/Typography/Text/Text.js.map +1 -1
  149. package/dist/cjs/components/Typography/Title/Title.d.ts +2 -2
  150. package/dist/cjs/components/Typography/Title/Title.js +9 -4
  151. package/dist/cjs/components/Typography/Title/Title.js.map +1 -1
  152. package/dist/cjs/components/View/View.js +68 -75
  153. package/dist/cjs/components/View/View.js.map +1 -1
  154. package/dist/cjs/components/View/ViewInfinite.js +78 -85
  155. package/dist/cjs/components/View/ViewInfinite.js.map +1 -1
  156. package/dist/cjs/components/View/utils.d.ts +2 -0
  157. package/dist/cjs/components/View/utils.js +13 -0
  158. package/dist/cjs/components/View/utils.js.map +1 -0
  159. package/dist/cjs/index.d.ts +4 -0
  160. package/dist/cjs/index.js +16 -0
  161. package/dist/cjs/index.js.map +1 -1
  162. package/dist/cjs/lib/accessibility.d.ts +1 -1
  163. package/dist/cjs/lib/accessibility.js.map +1 -1
  164. package/dist/cjs/lib/prefixClass.js +7 -6
  165. package/dist/cjs/lib/prefixClass.js.map +1 -1
  166. package/dist/cjs/lib/supportEvents.d.ts +3 -1
  167. package/dist/cjs/lib/supportEvents.js +1 -4
  168. package/dist/cjs/lib/supportEvents.js.map +1 -1
  169. package/dist/cjs/types.d.ts +3 -0
  170. package/dist/components/ActionSheet/ActionSheet.js +6 -9
  171. package/dist/components/ActionSheet/ActionSheet.js.map +1 -1
  172. package/dist/components/Avatar/Avatar.d.ts +2 -0
  173. package/dist/components/Avatar/Avatar.js +4 -2
  174. package/dist/components/Avatar/Avatar.js.map +1 -1
  175. package/dist/components/Banner/Banner.js.map +1 -1
  176. package/dist/components/Button/Button.js.map +1 -1
  177. package/dist/components/CardScroll/CardScroll.js +1 -1
  178. package/dist/components/CardScroll/CardScroll.js.map +1 -1
  179. package/dist/components/Cell/Cell.d.ts +11 -0
  180. package/dist/components/Cell/Cell.js +103 -177
  181. package/dist/components/Cell/Cell.js.map +1 -1
  182. package/dist/components/Cell/CellCheckbox/CellCheckbox.d.ts +5 -0
  183. package/dist/components/Cell/CellCheckbox/CellCheckbox.js +31 -0
  184. package/dist/components/Cell/CellCheckbox/CellCheckbox.js.map +1 -0
  185. package/dist/components/Cell/CellDragger/CellDragger.d.ts +6 -0
  186. package/dist/components/Cell/CellDragger/CellDragger.js +30 -0
  187. package/dist/components/Cell/CellDragger/CellDragger.js.map +1 -0
  188. package/dist/components/Cell/useDraggable.d.ts +13 -0
  189. package/dist/components/Cell/useDraggable.js +126 -0
  190. package/dist/components/Cell/useDraggable.js.map +1 -0
  191. package/dist/components/ChipsSelect/ChipsSelect.js +2 -2
  192. package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
  193. package/dist/components/Counter/Counter.js.map +1 -1
  194. package/dist/components/CustomSelect/CustomSelect.d.ts +0 -1
  195. package/dist/components/CustomSelect/CustomSelect.js +3 -5
  196. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  197. package/dist/components/DropdownIcon/DropdownIcon.d.ts +3 -0
  198. package/dist/components/DropdownIcon/DropdownIcon.js +19 -0
  199. package/dist/components/DropdownIcon/DropdownIcon.js.map +1 -0
  200. package/dist/components/FocusTrap/FocusTrap.d.ts +2 -3
  201. package/dist/components/FocusTrap/FocusTrap.js +3 -5
  202. package/dist/components/FocusTrap/FocusTrap.js.map +1 -1
  203. package/dist/components/FormField/FormField.d.ts +2 -3
  204. package/dist/components/FormField/FormField.js.map +1 -1
  205. package/dist/components/FormItem/FormItem.d.ts +2 -3
  206. package/dist/components/FormItem/FormItem.js.map +1 -1
  207. package/dist/components/FormLayout/FormLayout.d.ts +2 -4
  208. package/dist/components/FormLayout/FormLayout.js.map +1 -1
  209. package/dist/components/FormLayoutGroup/FormLayoutGroup.js +1 -0
  210. package/dist/components/FormLayoutGroup/FormLayoutGroup.js.map +1 -1
  211. package/dist/components/GridAvatar/GridAvatar.d.ts +9 -0
  212. package/dist/components/GridAvatar/GridAvatar.js +41 -0
  213. package/dist/components/GridAvatar/GridAvatar.js.map +1 -0
  214. package/dist/components/Header/Header.js.map +1 -1
  215. package/dist/components/HorizontalCell/HorizontalCell.d.ts +2 -3
  216. package/dist/components/HorizontalCell/HorizontalCell.js.map +1 -1
  217. package/dist/components/HorizontalScroll/HorizontalScroll.d.ts +3 -2
  218. package/dist/components/HorizontalScroll/HorizontalScroll.js +10 -12
  219. package/dist/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  220. package/dist/components/InitialsAvatar/InitialsAvatar.d.ts +33 -0
  221. package/dist/components/InitialsAvatar/InitialsAvatar.js +46 -0
  222. package/dist/components/InitialsAvatar/InitialsAvatar.js.map +1 -0
  223. package/dist/components/Link/Link.d.ts +1 -2
  224. package/dist/components/Link/Link.js.map +1 -1
  225. package/dist/components/ModalRoot/ModalRoot.js +167 -376
  226. package/dist/components/ModalRoot/ModalRoot.js.map +1 -1
  227. package/dist/components/ModalRoot/ModalRootContext.js +0 -3
  228. package/dist/components/ModalRoot/ModalRootContext.js.map +1 -1
  229. package/dist/components/ModalRoot/ModalRootDesktop.js +58 -244
  230. package/dist/components/ModalRoot/ModalRootDesktop.js.map +1 -1
  231. package/dist/components/ModalRoot/types.d.ts +0 -1
  232. package/dist/components/ModalRoot/types.js.map +1 -1
  233. package/dist/components/ModalRoot/useModalManager.d.ts +37 -0
  234. package/dist/components/ModalRoot/useModalManager.js +189 -0
  235. package/dist/components/ModalRoot/useModalManager.js.map +1 -0
  236. package/dist/components/NativeSelect/NativeSelect.js +2 -2
  237. package/dist/components/NativeSelect/NativeSelect.js.map +1 -1
  238. package/dist/components/Removable/Removable.d.ts +2 -1
  239. package/dist/components/Removable/Removable.js +73 -64
  240. package/dist/components/Removable/Removable.js.map +1 -1
  241. package/dist/components/SelectMimicry/SelectMimicry.js +2 -2
  242. package/dist/components/SelectMimicry/SelectMimicry.js.map +1 -1
  243. package/dist/components/SimpleCell/SimpleCell.d.ts +2 -2
  244. package/dist/components/SimpleCell/SimpleCell.js.map +1 -1
  245. package/dist/components/SplitCol/SplitCol.d.ts +3 -3
  246. package/dist/components/SplitCol/SplitCol.js +2 -4
  247. package/dist/components/SplitCol/SplitCol.js.map +1 -1
  248. package/dist/components/SubnavigationBar/SubnavigationBar.d.ts +2 -1
  249. package/dist/components/SubnavigationBar/SubnavigationBar.js +38 -11
  250. package/dist/components/SubnavigationBar/SubnavigationBar.js.map +1 -1
  251. package/dist/components/SubnavigationButton/SubnavigationButton.js.map +1 -1
  252. package/dist/components/Switch/Switch.d.ts +2 -3
  253. package/dist/components/Switch/Switch.js +15 -8
  254. package/dist/components/Switch/Switch.js.map +1 -1
  255. package/dist/components/Tabbar/Tabbar.js +3 -1
  256. package/dist/components/Tabbar/Tabbar.js.map +1 -1
  257. package/dist/components/TabbarItem/TabbarItem.d.ts +3 -1
  258. package/dist/components/TabbarItem/TabbarItem.js +26 -10
  259. package/dist/components/TabbarItem/TabbarItem.js.map +1 -1
  260. package/dist/components/Tappable/Tappable.d.ts +2 -3
  261. package/dist/components/Tappable/Tappable.js.map +1 -1
  262. package/dist/components/Textarea/Textarea.js +9 -6
  263. package/dist/components/Textarea/Textarea.js.map +1 -1
  264. package/dist/components/Touch/Touch.d.ts +16 -17
  265. package/dist/components/Touch/Touch.js +21 -7
  266. package/dist/components/Touch/Touch.js.map +1 -1
  267. package/dist/components/Typography/Caption/Caption.d.ts +2 -2
  268. package/dist/components/Typography/Caption/Caption.js +4 -2
  269. package/dist/components/Typography/Caption/Caption.js.map +1 -1
  270. package/dist/components/Typography/Headline/Headline.d.ts +2 -2
  271. package/dist/components/Typography/Headline/Headline.js +2 -1
  272. package/dist/components/Typography/Headline/Headline.js.map +1 -1
  273. package/dist/components/Typography/Subhead/Subhead.d.ts +2 -2
  274. package/dist/components/Typography/Subhead/Subhead.js +2 -1
  275. package/dist/components/Typography/Subhead/Subhead.js.map +1 -1
  276. package/dist/components/Typography/Text/Text.d.ts +2 -3
  277. package/dist/components/Typography/Text/Text.js +2 -1
  278. package/dist/components/Typography/Text/Text.js.map +1 -1
  279. package/dist/components/Typography/Title/Title.d.ts +2 -2
  280. package/dist/components/Typography/Title/Title.js +9 -4
  281. package/dist/components/Typography/Title/Title.js.map +1 -1
  282. package/dist/components/View/View.js +67 -75
  283. package/dist/components/View/View.js.map +1 -1
  284. package/dist/components/View/ViewInfinite.js +79 -87
  285. package/dist/components/View/ViewInfinite.js.map +1 -1
  286. package/dist/components/View/utils.d.ts +2 -0
  287. package/dist/components/View/utils.js +6 -0
  288. package/dist/components/View/utils.js.map +1 -0
  289. package/dist/components.css +1 -1
  290. package/dist/components.css.map +1 -1
  291. package/dist/cssm/components/ActionSheet/ActionSheet.js +6 -9
  292. package/dist/cssm/components/ActionSheet/ActionSheet.js.map +1 -1
  293. package/dist/cssm/components/Avatar/Avatar.js +4 -2
  294. package/dist/cssm/components/Avatar/Avatar.js.map +1 -1
  295. package/dist/cssm/components/Banner/Banner.js.map +1 -1
  296. package/dist/cssm/components/Button/Button.css +1 -1
  297. package/dist/cssm/components/Button/Button.js.map +1 -1
  298. package/dist/cssm/components/CardScroll/CardScroll.js +1 -1
  299. package/dist/cssm/components/CardScroll/CardScroll.js.map +1 -1
  300. package/dist/cssm/components/Cell/Cell.css +1 -1
  301. package/dist/cssm/components/Cell/Cell.js +103 -177
  302. package/dist/cssm/components/Cell/Cell.js.map +1 -1
  303. package/dist/cssm/components/Cell/CellCheckbox/CellCheckbox.css +1 -0
  304. package/dist/cssm/components/Cell/CellCheckbox/CellCheckbox.js +32 -0
  305. package/dist/cssm/components/Cell/CellCheckbox/CellCheckbox.js.map +1 -0
  306. package/dist/cssm/components/Cell/CellDragger/CellDragger.css +1 -0
  307. package/dist/cssm/components/Cell/CellDragger/CellDragger.js +31 -0
  308. package/dist/cssm/components/Cell/CellDragger/CellDragger.js.map +1 -0
  309. package/dist/cssm/components/Cell/useDraggable.js +126 -0
  310. package/dist/cssm/components/Cell/useDraggable.js.map +1 -0
  311. package/dist/cssm/components/ChipsSelect/ChipsSelect.js +2 -2
  312. package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
  313. package/dist/cssm/components/Counter/Counter.js.map +1 -1
  314. package/dist/cssm/components/CustomSelect/CustomSelect.js +3 -5
  315. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  316. package/dist/cssm/components/DropdownIcon/DropdownIcon.css +1 -0
  317. package/dist/cssm/components/DropdownIcon/DropdownIcon.js +20 -0
  318. package/dist/cssm/components/DropdownIcon/DropdownIcon.js.map +1 -0
  319. package/dist/cssm/components/FocusTrap/FocusTrap.js +3 -5
  320. package/dist/cssm/components/FocusTrap/FocusTrap.js.map +1 -1
  321. package/dist/cssm/components/FocusVisible/FocusVisible.css +1 -1
  322. package/dist/cssm/components/FormField/FormField.css +1 -1
  323. package/dist/cssm/components/FormField/FormField.js.map +1 -1
  324. package/dist/cssm/components/FormItem/FormItem.css +1 -1
  325. package/dist/cssm/components/FormItem/FormItem.js.map +1 -1
  326. package/dist/cssm/components/FormLayout/FormLayout.js.map +1 -1
  327. package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.css +1 -1
  328. package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.js +1 -0
  329. package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.js.map +1 -1
  330. package/dist/cssm/components/Gallery/Gallery.css +1 -1
  331. package/dist/cssm/components/GridAvatar/GridAvatar.css +1 -0
  332. package/dist/cssm/components/GridAvatar/GridAvatar.js +42 -0
  333. package/dist/cssm/components/GridAvatar/GridAvatar.js.map +1 -0
  334. package/dist/cssm/components/Header/Header.js.map +1 -1
  335. package/dist/cssm/components/HorizontalCell/HorizontalCell.js.map +1 -1
  336. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js +10 -12
  337. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  338. package/dist/cssm/components/HorizontalScroll/HorizontalScrollArrow.css +1 -1
  339. package/dist/cssm/components/IconButton/IconButton.css +1 -1
  340. package/dist/cssm/components/InitialsAvatar/InitialsAvatar.css +1 -0
  341. package/dist/cssm/components/InitialsAvatar/InitialsAvatar.js +52 -0
  342. package/dist/cssm/components/InitialsAvatar/InitialsAvatar.js.map +1 -0
  343. package/dist/cssm/components/Link/Link.js.map +1 -1
  344. package/dist/cssm/components/ModalRoot/ModalRoot.js +167 -376
  345. package/dist/cssm/components/ModalRoot/ModalRoot.js.map +1 -1
  346. package/dist/cssm/components/ModalRoot/ModalRootContext.js +0 -3
  347. package/dist/cssm/components/ModalRoot/ModalRootContext.js.map +1 -1
  348. package/dist/cssm/components/ModalRoot/ModalRootDesktop.js +58 -244
  349. package/dist/cssm/components/ModalRoot/ModalRootDesktop.js.map +1 -1
  350. package/dist/cssm/components/ModalRoot/types.js.map +1 -1
  351. package/dist/cssm/components/ModalRoot/useModalManager.js +189 -0
  352. package/dist/cssm/components/ModalRoot/useModalManager.js.map +1 -0
  353. package/dist/cssm/components/NativeSelect/NativeSelect.js +2 -2
  354. package/dist/cssm/components/NativeSelect/NativeSelect.js.map +1 -1
  355. package/dist/cssm/components/Removable/Removable.css +1 -1
  356. package/dist/cssm/components/Removable/Removable.js +73 -64
  357. package/dist/cssm/components/Removable/Removable.js.map +1 -1
  358. package/dist/cssm/components/Search/Search.css +1 -1
  359. package/dist/cssm/components/Select/Select.css +1 -1
  360. package/dist/cssm/components/SelectMimicry/SelectMimicry.js +2 -2
  361. package/dist/cssm/components/SelectMimicry/SelectMimicry.js.map +1 -1
  362. package/dist/cssm/components/SimpleCell/SimpleCell.css +1 -1
  363. package/dist/cssm/components/SimpleCell/SimpleCell.js.map +1 -1
  364. package/dist/cssm/components/SplitCol/SplitCol.js +2 -4
  365. package/dist/cssm/components/SplitCol/SplitCol.js.map +1 -1
  366. package/dist/cssm/components/SubnavigationBar/SubnavigationBar.js +38 -11
  367. package/dist/cssm/components/SubnavigationBar/SubnavigationBar.js.map +1 -1
  368. package/dist/cssm/components/SubnavigationButton/SubnavigationButton.js.map +1 -1
  369. package/dist/cssm/components/Switch/Switch.css +1 -1
  370. package/dist/cssm/components/Switch/Switch.js +15 -8
  371. package/dist/cssm/components/Switch/Switch.js.map +1 -1
  372. package/dist/cssm/components/Tabbar/Tabbar.css +1 -1
  373. package/dist/cssm/components/Tabbar/Tabbar.js +3 -1
  374. package/dist/cssm/components/Tabbar/Tabbar.js.map +1 -1
  375. package/dist/cssm/components/TabbarItem/TabbarItem.css +1 -1
  376. package/dist/cssm/components/TabbarItem/TabbarItem.js +26 -10
  377. package/dist/cssm/components/TabbarItem/TabbarItem.js.map +1 -1
  378. package/dist/cssm/components/Tappable/Tappable.js.map +1 -1
  379. package/dist/cssm/components/Textarea/Textarea.js +9 -6
  380. package/dist/cssm/components/Textarea/Textarea.js.map +1 -1
  381. package/dist/cssm/components/Touch/Touch.js +21 -7
  382. package/dist/cssm/components/Touch/Touch.js.map +1 -1
  383. package/dist/cssm/components/Typography/Caption/Caption.js +4 -2
  384. package/dist/cssm/components/Typography/Caption/Caption.js.map +1 -1
  385. package/dist/cssm/components/Typography/Headline/Headline.js +2 -1
  386. package/dist/cssm/components/Typography/Headline/Headline.js.map +1 -1
  387. package/dist/cssm/components/Typography/Subhead/Subhead.js +2 -1
  388. package/dist/cssm/components/Typography/Subhead/Subhead.js.map +1 -1
  389. package/dist/cssm/components/Typography/Text/Text.js +2 -1
  390. package/dist/cssm/components/Typography/Text/Text.js.map +1 -1
  391. package/dist/cssm/components/Typography/Title/Title.js +9 -4
  392. package/dist/cssm/components/Typography/Title/Title.js.map +1 -1
  393. package/dist/cssm/components/View/View.js +67 -75
  394. package/dist/cssm/components/View/View.js.map +1 -1
  395. package/dist/cssm/components/View/ViewInfinite.js +79 -87
  396. package/dist/cssm/components/View/ViewInfinite.js.map +1 -1
  397. package/dist/cssm/components/View/utils.js +6 -0
  398. package/dist/cssm/components/View/utils.js.map +1 -0
  399. package/dist/cssm/index.js +2 -0
  400. package/dist/cssm/index.js.map +1 -1
  401. package/dist/cssm/lib/accessibility.js.map +1 -1
  402. package/dist/cssm/lib/prefixClass.js +7 -6
  403. package/dist/cssm/lib/prefixClass.js.map +1 -1
  404. package/dist/cssm/lib/supportEvents.js +1 -4
  405. package/dist/cssm/lib/supportEvents.js.map +1 -1
  406. package/dist/cssm/styles/components.css +1 -1
  407. package/dist/cssm/styles/themes.css +1 -1
  408. package/dist/cssm/styles/vkcom_light.css +1 -1
  409. package/dist/index.d.ts +4 -0
  410. package/dist/index.js +2 -0
  411. package/dist/index.js.map +1 -1
  412. package/dist/lib/accessibility.d.ts +1 -1
  413. package/dist/lib/accessibility.js.map +1 -1
  414. package/dist/lib/prefixClass.js +7 -6
  415. package/dist/lib/prefixClass.js.map +1 -1
  416. package/dist/lib/supportEvents.d.ts +3 -1
  417. package/dist/lib/supportEvents.js +1 -4
  418. package/dist/lib/supportEvents.js.map +1 -1
  419. package/dist/types.d.ts +3 -0
  420. package/dist/vkui.css +2 -2
  421. package/dist/vkui.css.map +1 -1
  422. package/package.json +8 -4
  423. package/src/components/ActionSheet/ActionSheet.tsx +4 -5
  424. package/src/components/ActionSheet/Readme.md +18 -14
  425. package/src/components/Alert/Readme.md +15 -11
  426. package/src/components/Avatar/Avatar.tsx +5 -2
  427. package/src/components/Banner/Banner.tsx +4 -5
  428. package/src/components/Button/Button.css +26 -53
  429. package/src/components/Button/Button.tsx +2 -3
  430. package/src/components/Card/Readme.md +6 -6
  431. package/src/components/CardScroll/CardScroll.tsx +4 -1
  432. package/src/components/Cell/Cell.css +21 -58
  433. package/src/components/Cell/Cell.tsx +101 -162
  434. package/src/components/Cell/CellCheckbox/CellCheckbox.css +17 -0
  435. package/src/components/Cell/CellCheckbox/CellCheckbox.tsx +42 -0
  436. package/src/components/Cell/CellDragger/CellDragger.css +4 -0
  437. package/src/components/Cell/CellDragger/CellDragger.tsx +40 -0
  438. package/src/components/Cell/Readme.md +89 -51
  439. package/src/components/Cell/useDraggable.tsx +112 -0
  440. package/src/components/ChipsSelect/ChipsSelect.tsx +2 -2
  441. package/src/components/Counter/Counter.tsx +2 -2
  442. package/src/components/CustomSelect/CustomSelect.tsx +3 -4
  443. package/src/components/DropdownIcon/DropdownIcon.css +3 -0
  444. package/src/components/DropdownIcon/DropdownIcon.tsx +20 -0
  445. package/src/components/Epic/Readme.md +2 -1
  446. package/src/components/FocusTrap/FocusTrap.tsx +13 -11
  447. package/src/components/FocusVisible/FocusVisible.css +12 -4
  448. package/src/components/FormField/FormField.css +0 -1
  449. package/src/components/FormField/FormField.tsx +2 -2
  450. package/src/components/FormItem/FormItem.css +13 -14
  451. package/src/components/FormItem/FormItem.tsx +2 -3
  452. package/src/components/FormLayout/FormLayout.tsx +2 -4
  453. package/src/components/FormLayoutGroup/FormLayoutGroup.css +11 -7
  454. package/src/components/FormLayoutGroup/FormLayoutGroup.tsx +10 -1
  455. package/src/components/Gallery/Gallery.css +2 -3
  456. package/src/components/Gallery/Readme.md +89 -109
  457. package/src/components/GridAvatar/GridAvatar.css +37 -0
  458. package/src/components/GridAvatar/GridAvatar.tsx +55 -0
  459. package/src/components/GridAvatar/Readme.md +12 -0
  460. package/src/components/Group/Readme.md +18 -14
  461. package/src/components/Header/Header.tsx +4 -4
  462. package/src/components/HorizontalCell/HorizontalCell.tsx +3 -3
  463. package/src/components/HorizontalScroll/HorizontalScroll.tsx +14 -18
  464. package/src/components/HorizontalScroll/HorizontalScrollArrow.css +2 -2
  465. package/src/components/IconButton/IconButton.css +7 -0
  466. package/src/components/InitialsAvatar/InitialsAvatar.css +53 -0
  467. package/src/components/InitialsAvatar/InitialsAvatar.tsx +90 -0
  468. package/src/components/InitialsAvatar/Readme.md +14 -0
  469. package/src/components/Link/Link.tsx +1 -1
  470. package/src/components/MiniInfoCell/Readme.md +66 -62
  471. package/src/components/ModalDismissButton/Readme.md +13 -10
  472. package/src/components/ModalRoot/ModalRoot.tsx +159 -349
  473. package/src/components/ModalRoot/ModalRootContext.tsx +0 -1
  474. package/src/components/ModalRoot/ModalRootDesktop.tsx +54 -240
  475. package/src/components/ModalRoot/Readme.md +35 -27
  476. package/src/components/ModalRoot/types.ts +0 -1
  477. package/src/components/ModalRoot/useModalManager.tsx +174 -0
  478. package/src/components/NativeSelect/NativeSelect.tsx +2 -2
  479. package/src/components/Removable/Removable.css +16 -63
  480. package/src/components/Removable/Removable.tsx +84 -64
  481. package/src/components/ScreenSpinner/Readme.md +13 -9
  482. package/src/components/Search/Search.css +1 -1
  483. package/src/components/Select/Select.css +1 -1
  484. package/src/components/SelectMimicry/SelectMimicry.tsx +2 -2
  485. package/src/components/SimpleCell/SimpleCell.css +10 -18
  486. package/src/components/SimpleCell/SimpleCell.tsx +3 -5
  487. package/src/components/SplitCol/SplitCol.tsx +4 -8
  488. package/src/components/SplitLayout/Readme.md +2 -2
  489. package/src/components/SubnavigationBar/Readme.md +90 -86
  490. package/src/components/SubnavigationBar/SubnavigationBar.tsx +32 -14
  491. package/src/components/SubnavigationButton/SubnavigationButton.tsx +2 -3
  492. package/src/components/Switch/Readme.md +6 -6
  493. package/src/components/Switch/Switch.css +46 -15
  494. package/src/components/Switch/Switch.tsx +16 -8
  495. package/src/components/Tabbar/Tabbar.css +15 -4
  496. package/src/components/Tabbar/Tabbar.tsx +3 -1
  497. package/src/components/TabbarItem/Readme.md +72 -0
  498. package/src/components/TabbarItem/TabbarItem.css +65 -14
  499. package/src/components/TabbarItem/TabbarItem.tsx +46 -22
  500. package/src/components/Tappable/Tappable.tsx +2 -3
  501. package/src/components/Textarea/Readme.md +3 -0
  502. package/src/components/Textarea/Textarea.tsx +10 -6
  503. package/src/components/Touch/Touch.tsx +38 -25
  504. package/src/components/Typography/Caption/Caption.tsx +4 -4
  505. package/src/components/Typography/Headline/Headline.tsx +3 -3
  506. package/src/components/Typography/Subhead/Subhead.tsx +3 -3
  507. package/src/components/Typography/Text/Text.tsx +3 -4
  508. package/src/components/Typography/Title/Title.tsx +9 -5
  509. package/src/components/View/Readme.md +42 -56
  510. package/src/components/View/View.tsx +46 -61
  511. package/src/components/View/ViewInfinite.tsx +52 -67
  512. package/src/components/View/utils.ts +8 -0
  513. package/src/index.ts +4 -0
  514. package/src/lib/accessibility.ts +2 -2
  515. package/src/lib/prefixClass.ts +9 -6
  516. package/src/lib/supportEvents.ts +1 -4
  517. package/src/styles/components.css +4 -0
  518. package/src/styles/vkcom_light.css +3 -3
  519. package/src/testing/utils.tsx +34 -1
  520. package/src/types.ts +4 -0
@@ -5,7 +5,6 @@ import { getClassName } from '../../helpers/getClassName';
5
5
  import { classNames } from '../../lib/classNames';
6
6
  import { setTransformStyle } from '../../lib/styles';
7
7
  import { rubber } from '../../lib/touch';
8
- import { isFunction } from '../../lib/utils';
9
8
  import { ANDROID, IOS, VKCOM } from '../../lib/platform';
10
9
  import { transitionEvent } from '../../lib/supportEvents';
11
10
  import { HasPlatform } from '../../types';
@@ -17,12 +16,13 @@ import {
17
16
  ConfigProviderContextInterface,
18
17
  WebviewType,
19
18
  } from '../ConfigProvider/ConfigProviderContext';
20
- import { ModalsState, ModalsStateEntry, ModalType, TranslateRange } from './types';
19
+ import { ModalsStateEntry, ModalType, TranslateRange } from './types';
21
20
  import { MODAL_PAGE_DEFAULT_PERCENT_HEIGHT } from './constants';
22
21
  import { DOMProps, withDOM } from '../../lib/dom';
23
22
  import { getNavId } from '../../lib/getNavId';
24
23
  import { warnOnce } from '../../lib/warnOnce';
25
24
  import { FocusTrap } from '../FocusTrap/FocusTrap';
25
+ import { ModalTransitionProps, withModalManager } from './useModalManager';
26
26
  import './ModalRoot.css';
27
27
 
28
28
  const warn = warnOnce('ModalRoot');
@@ -50,57 +50,31 @@ export interface ModalRootProps extends HasPlatform {
50
50
  }
51
51
 
52
52
  interface ModalRootState {
53
- activeModal?: string;
54
- prevModal?: string;
55
- nextModal?: string;
56
- visibleModals?: string[];
57
- animated?: boolean;
58
- switching?: boolean;
59
- history?: string[];
60
- isBack?: boolean;
61
- inited?: boolean;
62
53
  touchDown?: boolean;
63
54
  dragging?: boolean;
64
55
  }
65
56
 
66
- class ModalRootTouchComponent extends React.Component<ModalRootProps & DOMProps, ModalRootState> {
67
- constructor(props: ModalRootProps) {
57
+ class ModalRootTouchComponent extends React.Component<ModalRootProps & DOMProps & ModalTransitionProps, ModalRootState> {
58
+ constructor(props: ModalRootProps & ModalTransitionProps) {
68
59
  super(props);
69
-
70
- const activeModal = props.activeModal;
71
-
72
60
  this.state = {
73
- activeModal: null,
74
- prevModal: null,
75
- nextModal: activeModal,
76
- visibleModals: activeModal ? [activeModal] : [],
77
- animated: !!activeModal,
78
- switching: false,
79
- history: activeModal ? [activeModal] : [],
80
- isBack: false,
81
- inited: false,
82
61
  touchDown: false,
83
62
  dragging: false,
84
63
  };
85
64
 
86
- this.activeTransitions = 0;
87
65
  this.maskElementRef = React.createRef();
88
66
 
89
- this.initModalsState();
90
-
91
67
  this.modalRootContext = {
92
68
  updateModalHeight: this.updateModalHeight,
93
- registerModal: ({ id, ...data }) => Object.assign(this.modalsState[id], data),
94
- onClose: this.triggerActiveModalClose,
69
+ registerModal: ({ id, ...data }) => Object.assign(this.getModalState(id), data),
70
+ onClose: () => this.props.closeActiveModal(),
95
71
  isInsideModal: true,
96
72
  };
97
73
 
98
74
  this.frameIds = {};
99
75
  }
100
76
 
101
- private modalsState: ModalsState;
102
77
  private documentScrolling: boolean;
103
- private activeTransitions: number;
104
78
  private readonly maskElementRef: React.RefObject<HTMLDivElement>;
105
79
  private readonly viewportRef = React.createRef<HTMLDivElement>();
106
80
  private maskAnimationFrame: number;
@@ -122,89 +96,54 @@ class ModalRootTouchComponent extends React.Component<ModalRootProps & DOMProps,
122
96
  return this.props.window;
123
97
  }
124
98
 
125
- getModals() {
126
- return React.Children.toArray(this.props.children) as React.ReactElement[];
99
+ getModalState(id: string) {
100
+ return this.props.getModalState(id);
127
101
  }
128
102
 
129
- initModalsState() {
130
- this.modalsState = this.getModals().reduce<ModalsState>((acc, Modal) => {
131
- const modalProps = Modal.props;
132
- const state: ModalsStateEntry = {
133
- id: getNavId(modalProps, warn),
134
- onClose: Modal.props.onClose,
135
- dynamicContentHeight: !!modalProps.dynamicContentHeight,
136
- };
137
-
138
- // ModalPage props
139
- if (typeof modalProps.settlingHeight === 'number') {
140
- state.settlingHeight = modalProps.settlingHeight;
141
- }
142
-
143
- acc[state.id] = state;
144
- return acc;
145
- }, {});
103
+ getModals() {
104
+ return React.Children.toArray(this.props.children) as React.ReactElement[];
146
105
  }
147
106
 
148
107
  componentDidMount() {
149
- this.initActiveModal();
108
+ // Отслеживаем изменение размеров viewport (Необходимо для iOS)
109
+ if (this.props.platform === IOS) {
110
+ this.window.addEventListener('resize', this.updateModalTranslate, false);
111
+ }
150
112
  }
151
113
 
152
114
  componentWillUnmount() {
153
115
  this.toggleDocumentScrolling(true);
154
- if (this.props.platform === IOS) {
155
- this.window.removeEventListener('resize', this.updateModalTranslate, false);
156
- }
116
+ this.window.removeEventListener('resize', this.updateModalTranslate, false);
157
117
  }
158
118
 
159
- componentDidUpdate(prevProps: ModalRootProps, prevState: ModalRootState) {
160
- if (this.props.activeModal !== prevProps.activeModal && !this.state.switching) {
161
- const nextModal = this.props.activeModal;
162
- const prevModal = prevProps.activeModal;
163
-
164
- if (IS_DEV && nextModal !== null && !this.modalsState[nextModal]) {
165
- return warn(`[componentDidUpdate] nextModal ${nextModal} not found`);
166
- }
167
-
168
- let history = [...this.state.history];
169
- let isBack = false;
170
-
171
- if (nextModal === null) {
172
- history = [];
173
- } else if (history.includes(nextModal)) {
174
- history = history.splice(0, history.indexOf(nextModal) + 1);
175
- isBack = true;
176
- } else {
177
- history.push(nextModal);
178
- }
119
+ componentDidUpdate(prevProps: ModalRootProps & ModalTransitionProps) {
120
+ // transition phase 2: animate exiting modal
121
+ if (this.props.exitingModal && this.props.exitingModal !== prevProps.exitingModal) {
122
+ this.closeModal(this.props.exitingModal);
123
+ }
179
124
 
180
- return this.setState({
181
- activeModal: null,
182
- nextModal,
183
- prevModal,
184
- visibleModals: [nextModal, prevModal],
185
- history,
186
- isBack,
187
- animated: true,
188
- inited: false,
189
- switching: false,
190
- }, () => {
191
- if (nextModal === null) {
192
- this.closeActiveModal();
193
- } else {
194
- this.initActiveModal();
195
- }
125
+ // transition phase 3: animate entering modal
126
+ if (this.props.enteringModal && this.props.enteringModal !== prevProps.enteringModal) {
127
+ const { enteringModal } = this.props;
128
+ const enteringState = this.getModalState(enteringModal);
129
+ this.waitTransitionFinish(enteringState, () => {
130
+ enteringState.innerElement.style.transitionDelay = null;
131
+ this.props.onEnter(enteringModal);
196
132
  });
133
+ enteringState.innerElement.style.transitionDelay = this.props.delayEnter ? `${this.timeout}ms` : null;
134
+ this.animateTranslate(enteringState, enteringState.translateY);
197
135
  }
198
136
 
199
- if (this.state.switching && !prevState.switching) {
200
- requestAnimationFrame(() => this.switchPrevNext());
137
+ // focus restoration
138
+ if (this.props.activeModal && !prevProps.activeModal) {
139
+ this.restoreFocusTo = this.document.activeElement as HTMLElement;
201
140
  }
202
-
203
- if (!this.state.activeModal && !this.state.prevModal && !this.state.nextModal) {
204
- this.toggleDocumentScrolling(true);
205
- } else {
206
- this.toggleDocumentScrolling(false);
141
+ if (!this.props.activeModal && !this.props.exitingModal && this.restoreFocusTo) {
142
+ this.restoreFocusTo.focus();
143
+ this.restoreFocusTo = null;
207
144
  }
145
+
146
+ this.toggleDocumentScrolling(!this.props.activeModal && !this.props.exitingModal);
208
147
  }
209
148
 
210
149
  /* Отключает скролл документа */
@@ -238,117 +177,17 @@ class ModalRootTouchComponent extends React.Component<ModalRootProps & DOMProps,
238
177
  return false;
239
178
  };
240
179
 
241
- /**
242
- * Инициализирует модалку перед анимацией открытия
243
- */
244
- initActiveModal() {
245
- const activeModal = this.state.activeModal || this.state.nextModal;
246
- if (!activeModal) {
247
- return;
248
- }
249
-
250
- const modalState = this.modalsState[activeModal];
251
- // Отслеживаем изменение размеров viewport (Необходимо для iOS)
252
- if (this.props.platform === IOS) {
253
- this.window.addEventListener('resize', this.updateModalTranslate, false);
254
- }
255
-
256
- switch (modalState.type) {
257
- case ModalType.PAGE:
258
- modalState.settlingHeight = modalState.settlingHeight || MODAL_PAGE_DEFAULT_PERCENT_HEIGHT;
259
- this.initPageModal(modalState);
260
- break;
261
-
262
- case ModalType.CARD:
263
- this.initCardModal(modalState);
264
- break;
265
-
266
- default:
267
- if (IS_DEV) {
268
- warn('[initActiveModal] modalState.type is unknown');
269
- }
270
- }
271
-
272
- this.setState({ inited: true, switching: true });
273
- }
274
-
275
180
  updateModalTranslate = () => {
276
- const activeModal = this.state.activeModal || this.state.nextModal;
277
- if (!activeModal) {
278
- return;
279
- }
280
-
281
- const modalState = this.modalsState[activeModal];
282
- this.animateTranslate(modalState, modalState.translateY);
181
+ const modalState = this.getModalState(this.props.activeModal);
182
+ modalState && this.animateTranslate(modalState, modalState.translateY);
283
183
  };
284
184
 
285
- initPageModal(modalState: ModalsStateEntry) {
286
- const { contentElement } = modalState;
287
- const contentHeight = (contentElement.firstElementChild as HTMLElement).offsetHeight;
288
-
289
- let prevTranslateY = modalState.translateY;
290
-
291
- modalState.expandable = contentHeight > contentElement.clientHeight || modalState.settlingHeight === 100;
292
-
293
- let collapsed = false;
294
- let expanded = false;
295
- let translateYFrom;
296
- let translateY;
297
- let expandedRange: TranslateRange;
298
- let collapsedRange: TranslateRange;
299
- let hiddenRange: TranslateRange;
300
-
301
- if (modalState.expandable) {
302
- translateYFrom = 100 - modalState.settlingHeight;
303
-
304
- const shiftHalf = translateYFrom / 2;
305
- const visiblePart = 100 - translateYFrom;
306
-
307
- expandedRange = [0, shiftHalf];
308
- collapsedRange = [shiftHalf, translateYFrom + visiblePart / 4];
309
- hiddenRange = [translateYFrom + visiblePart / 4, 100];
310
-
311
- collapsed = translateYFrom > 0;
312
- expanded = translateYFrom <= 0;
313
- translateY = translateYFrom;
314
- } else {
315
- const headerHeight = modalState.headerElement.offsetHeight;
316
- const height = contentHeight + headerHeight;
317
-
318
- translateYFrom = 100 - height / modalState.innerElement.parentElement.offsetHeight * 100;
319
- translateY = translateYFrom;
320
-
321
- expandedRange = [translateY, translateY + 25];
322
- collapsedRange = [translateY + 25, translateY + 25];
323
- hiddenRange = [translateY + 25, translateY + 100];
324
- }
325
-
326
- // Если модалка может открываться на весь экран, и новый сдвиг больше предыдущего, то откроем её на весь экран
327
- if (modalState.expandable && translateY > prevTranslateY || modalState.settlingHeight === 100) {
328
- translateY = 0;
329
- }
330
-
331
- modalState.expandedRange = expandedRange;
332
- modalState.collapsedRange = collapsedRange;
333
- modalState.hiddenRange = hiddenRange;
334
- modalState.translateY = translateY;
335
- modalState.translateYFrom = translateYFrom;
336
- modalState.collapsed = collapsed;
337
- modalState.expanded = expanded;
338
- }
339
-
340
- initCardModal(modalState: ModalsStateEntry) {
341
- modalState.translateY = 0;
342
- }
343
-
344
185
  checkPageContentHeight() {
345
- const { activeModal, nextModal } = this.state;
346
- const modalId = activeModal || nextModal;
186
+ const modalState = this.getModalState(this.props.activeModal);
347
187
 
348
- const modalState = this.modalsState[modalId];
349
188
  if (modalState?.type === ModalType.PAGE && modalState?.modalElement) {
350
189
  const prevModalState = { ...modalState };
351
- this.initPageModal(modalState);
190
+ initPageModal(modalState);
352
191
  const currentModalState = { ...modalState };
353
192
 
354
193
  let needAnimate = false;
@@ -368,13 +207,10 @@ class ModalRootTouchComponent extends React.Component<ModalRootProps & DOMProps,
368
207
  }
369
208
 
370
209
  updateModalHeight = () => {
371
- const { activeModal, nextModal } = this.state;
372
-
373
- const modalId = activeModal || nextModal;
374
- const modalState = modalId ? this.modalsState[modalId] : undefined;
210
+ const modalState = this.getModalState(this.props.activeModal);
375
211
 
376
212
  if (modalState && modalState.type === ModalType.PAGE && modalState.dynamicContentHeight) {
377
- if (this.state.switching) {
213
+ if (this.props.enteringModal) {
378
214
  this.waitTransitionFinish(modalState, () => {
379
215
  requestAnimationFrame(() => this.checkPageContentHeight());
380
216
  });
@@ -384,37 +220,42 @@ class ModalRootTouchComponent extends React.Component<ModalRootProps & DOMProps,
384
220
  }
385
221
  };
386
222
 
387
- closeActiveModal() {
223
+ closeModal(id: string) {
388
224
  // Сбрасываем состояния, которые могут помешать закрытию модального окна
389
- this.setState({ touchDown: false, switching: false });
225
+ this.setState({ touchDown: false });
390
226
 
391
- if (this.props.platform === IOS) {
392
- this.window.removeEventListener('resize', this.updateModalTranslate, false);
393
- }
227
+ const prevModalState = this.getModalState(id);
394
228
 
395
- const { prevModal } = this.state;
396
- if (!prevModal) {
397
- return warn(`[closeActiveModal] prevModal is ${prevModal}`);
229
+ if (!prevModalState) {
230
+ id && warn(`[closeActiveModal] Modal ${id} does not exist - not closing`);
231
+ return;
398
232
  }
399
233
 
400
- const prevModalState = this.modalsState[prevModal];
234
+ const nextModalState = this.getModalState(this.props.activeModal);
235
+ const nextIsPage = !!nextModalState && nextModalState.type === ModalType.PAGE;
236
+
237
+ const prevIsPage = !!prevModalState && prevModalState.type === ModalType.PAGE;
238
+ this.waitTransitionFinish(prevModalState, () => this.props.onExit(id));
239
+ const exitTranslate = prevIsPage && nextIsPage && prevModalState.translateY <= nextModalState.translateYFrom && !this.props.isBack
240
+ ? nextModalState.translateYFrom + 10
241
+ : 100;
242
+ this.animateTranslate(prevModalState, exitTranslate);
401
243
 
402
- this.waitTransitionFinish(prevModalState, this.prevNextSwitchEndHandler);
403
- this.animateTranslate(prevModalState, 100);
404
- this.setMaskOpacity(prevModalState, 0);
244
+ if (!nextModalState) {
245
+ // NOTE: was only for clean exit
246
+ this.setMaskOpacity(prevModalState, 0);
247
+ }
405
248
  }
406
249
 
407
250
  onTouchMove = (e: TouchEvent) => {
408
- if (this.state.switching) {
251
+ if (this.props.exitingModal) {
409
252
  return;
410
253
  }
411
- const activeModal = this.state.activeModal || this.state.nextModal;
412
- if (!activeModal) {
254
+ const modalState = this.getModalState(this.props.activeModal);
255
+ if (!modalState) {
413
256
  return;
414
257
  }
415
258
 
416
- const modalState = this.modalsState[activeModal];
417
-
418
259
  if (modalState.type === ModalType.PAGE) {
419
260
  return this.onPageTouchMove(e, modalState);
420
261
  }
@@ -501,11 +342,7 @@ class ModalRootTouchComponent extends React.Component<ModalRootProps & DOMProps,
501
342
  }
502
343
 
503
344
  onTouchEnd = (e: TouchEvent) => {
504
- const activeModal = this.state.activeModal || this.state.nextModal;
505
- if (!activeModal) {
506
- return;
507
- }
508
- const modalState = this.modalsState[activeModal];
345
+ const modalState = this.getModalState(this.props.activeModal);
509
346
 
510
347
  if (modalState.type === ModalType.PAGE) {
511
348
  return this.onPageTouchEnd(e, modalState);
@@ -560,7 +397,7 @@ class ModalRootTouchComponent extends React.Component<ModalRootProps & DOMProps,
560
397
  modalState.hidden = translateY === 100;
561
398
 
562
399
  if (modalState.hidden) {
563
- this.doCloseModal(modalState);
400
+ this.props.closeActiveModal();
564
401
  }
565
402
 
566
403
  setStateCallback = () => {
@@ -597,7 +434,7 @@ class ModalRootTouchComponent extends React.Component<ModalRootProps & DOMProps,
597
434
  modalState.hidden = translateY === 100;
598
435
 
599
436
  if (modalState.hidden) {
600
- this.doCloseModal(modalState);
437
+ this.props.closeActiveModal();
601
438
  }
602
439
 
603
440
  setStateCallback = () => {
@@ -616,14 +453,14 @@ class ModalRootTouchComponent extends React.Component<ModalRootProps & DOMProps,
616
453
  }
617
454
 
618
455
  onScroll = (e: React.SyntheticEvent) => {
619
- const activeModal = this.state.activeModal;
456
+ const activeModal = this.props.activeModal;
620
457
 
621
458
  const target = e.target as HTMLElement;
622
459
 
623
460
  if (!activeModal) {
624
461
  return;
625
462
  }
626
- const modalState = this.modalsState[activeModal];
463
+ const modalState = this.getModalState(activeModal);
627
464
  if (modalState.type === ModalType.PAGE && modalState.contentElement.contains(target)) {
628
465
  modalState.contentScrolled = true;
629
466
 
@@ -650,80 +487,6 @@ class ModalRootTouchComponent extends React.Component<ModalRootProps & DOMProps,
650
487
  }
651
488
  }
652
489
 
653
- switchPrevNext() {
654
- const { prevModal, nextModal } = this.state;
655
-
656
- const prevModalState = this.modalsState[prevModal];
657
- const nextModalState = this.modalsState[nextModal];
658
-
659
- if (IS_DEV && !prevModalState && !nextModalState) {
660
- return warn(`[switchPrevNext] prevModal is ${prevModal}, nextModal is ${nextModal}`);
661
- }
662
-
663
- const prevIsPage = !!prevModalState && prevModalState.type === ModalType.PAGE;
664
- const prevIsCard = !!prevModalState && prevModalState.type === ModalType.CARD;
665
-
666
- const nextIsPage = !!nextModalState && nextModalState.type === ModalType.PAGE;
667
- const nextIsCard = !!nextModalState && nextModalState.type === ModalType.CARD;
668
-
669
- // Ждём полного скрытия предыдущей модалки
670
- if (prevModalState && (nextIsCard || prevIsCard && nextIsPage)) {
671
- this.waitTransitionFinish(prevModalState, () => {
672
- this.activeTransitions += 1;
673
- this.waitTransitionFinish(nextModalState, this.prevNextSwitchEndHandler);
674
- this.animateTranslate(nextModalState, nextModalState.translateY);
675
- });
676
-
677
- return this.animateTranslate(prevModalState, 100);
678
- }
679
-
680
- if (prevModalState && nextIsPage) {
681
- this.activeTransitions += 1;
682
- this.waitTransitionFinish(prevModalState, this.prevNextSwitchEndHandler);
683
-
684
- if (prevIsPage && prevModalState.translateY <= nextModalState.translateYFrom && !this.state.isBack) {
685
- this.animateTranslate(prevModalState, nextModalState.translateYFrom + 10);
686
- } else {
687
- this.animateTranslate(prevModalState, 100);
688
- }
689
- }
690
-
691
- if (!prevModal && this.document.activeElement) {
692
- this.restoreFocusTo = this.document.activeElement as HTMLElement;
693
- }
694
-
695
- this.activeTransitions += 1;
696
- this.waitTransitionFinish(nextModalState, this.prevNextSwitchEndHandler);
697
- this.animateTranslate(nextModalState, nextModalState.translateY);
698
- }
699
-
700
- prevNextSwitchEndHandler = () => {
701
- this.activeTransitions = Math.max(0, this.activeTransitions - 1);
702
- if (this.activeTransitions > 0) {
703
- return;
704
- }
705
-
706
- const activeModal = this.state.nextModal;
707
-
708
- const newState: ModalRootState = {
709
- prevModal: null,
710
- nextModal: null,
711
- visibleModals: [activeModal],
712
- activeModal: activeModal,
713
- animated: false,
714
- switching: false,
715
- };
716
-
717
- if (!activeModal) {
718
- newState.history = [];
719
- if (this.restoreFocusTo) {
720
- this.restoreFocusTo.focus();
721
- }
722
- }
723
-
724
- this.setState(newState);
725
- };
726
-
727
490
  /**
728
491
  * Анимирует сдвиг модалки
729
492
  *
@@ -737,19 +500,12 @@ class ModalRootTouchComponent extends React.Component<ModalRootProps & DOMProps,
737
500
 
738
501
  this.frameIds[frameId] = requestAnimationFrame(() => {
739
502
  setTransformStyle(modalState.innerElement, `translate3d(0, ${percent}%, 0)`);
740
-
741
- if (modalState.type === ModalType.PAGE && modalState.footerElement) {
742
- const footerHeight = modalState.footerElement.offsetHeight;
743
- const factor = modalState.innerElement.offsetHeight * (percent / 100);
744
-
745
- setTransformStyle(modalState.footerElement, `translateY(calc(${footerHeight}px * -${factor / footerHeight}))`);
746
- }
747
503
  });
748
504
  }
749
505
 
750
506
  /* Устанавливает прозрачность для полупрозрачной подложки */
751
507
  setMaskOpacity(modalState: ModalsStateEntry, forceOpacity: number = null) {
752
- if (forceOpacity === null && this.state.history[0] !== modalState.id) {
508
+ if (forceOpacity === null && this.props.history[0] !== modalState.id) {
753
509
  return;
754
510
  }
755
511
 
@@ -764,33 +520,11 @@ class ModalRootTouchComponent extends React.Component<ModalRootProps & DOMProps,
764
520
  });
765
521
  }
766
522
 
767
- /**
768
- * Закрывает текущую модалку
769
- */
770
- triggerActiveModalClose = () => {
771
- const activeModalState = this.modalsState[this.state.activeModal];
772
- if (activeModalState) {
773
- this.doCloseModal(activeModalState);
774
- }
775
- };
776
-
777
- private readonly doCloseModal = (modalState: ModalsStateEntry) => {
778
- // Сбрасываем состояния, которые могут помешать закрытию модального окна
779
- this.setState({ touchDown: false, switching: false });
780
-
781
- if (isFunction(modalState.onClose)) {
782
- modalState.onClose();
783
- } else if (isFunction(this.props.onClose)) {
784
- this.props.onClose(modalState.id);
785
- } else if (IS_DEV) {
786
- warn('onClose is undefined');
787
- }
788
- };
789
-
790
523
  render() {
791
- const { prevModal, activeModal, nextModal, visibleModals, animated, touchDown, dragging, switching } = this.state;
524
+ const { activeModal, exitingModal, enteringModal } = this.props;
525
+ const { touchDown, dragging } = this.state;
792
526
 
793
- if (!activeModal && !prevModal && !nextModal && !animated) {
527
+ if (!activeModal && !exitingModal) {
794
528
  return null;
795
529
  }
796
530
 
@@ -801,7 +535,7 @@ class ModalRootTouchComponent extends React.Component<ModalRootProps & DOMProps,
801
535
  vkuiClass={classNames(getClassName('ModalRoot', this.props.platform), {
802
536
  'ModalRoot--vkapps': this.props.configProvider.webviewType === WebviewType.VKAPPS,
803
537
  'ModalRoot--touched': touchDown,
804
- 'ModalRoot--switching': switching,
538
+ 'ModalRoot--switching': !!(enteringModal || exitingModal),
805
539
  })}
806
540
  onMove={this.onTouchMove}
807
541
  onEnd={this.onTouchEnd}
@@ -809,16 +543,16 @@ class ModalRootTouchComponent extends React.Component<ModalRootProps & DOMProps,
809
543
  >
810
544
  <div
811
545
  vkuiClass="ModalRoot__mask"
812
- onClick={this.triggerActiveModalClose}
546
+ onClick={this.props.closeActiveModal}
813
547
  ref={this.maskElementRef}
814
548
  />
815
549
  <div vkuiClass="ModalRoot__viewport" ref={this.viewportRef}>
816
550
  {this.getModals().map((Modal) => {
817
551
  const modalId = getNavId(Modal.props, warn);
818
- if (!visibleModals.includes(modalId)) {
552
+ if (modalId !== activeModal && modalId !== exitingModal) {
819
553
  return null;
820
554
  }
821
- const modalState = { ...this.modalsState[modalId] };
555
+ const modalState = { ...this.getModalState(modalId) };
822
556
 
823
557
  const isPage = modalState.type === ModalType.PAGE;
824
558
  const key = `modal-${modalId}`;
@@ -826,13 +560,13 @@ class ModalRootTouchComponent extends React.Component<ModalRootProps & DOMProps,
826
560
  return (
827
561
  <FocusTrap
828
562
  key={key}
829
- getRootRef={(e) => this.modalsState[modalId].modalElement = e}
830
- onClose={this.triggerActiveModalClose}
563
+ getRootRef={(e) => this.getModalState(modalId).modalElement = e}
564
+ onClose={this.props.closeActiveModal}
831
565
  timeout={this.timeout}
832
566
  vkuiClass={classNames('ModalRoot__modal', {
833
567
  'ModalRoot__modal--active': modalId === activeModal,
834
- 'ModalRoot__modal--prev': modalId === prevModal,
835
- 'ModalRoot__modal--next': modalId === nextModal,
568
+ 'ModalRoot__modal--prev': modalId === exitingModal,
569
+ 'ModalRoot__modal--next': exitingModal && modalId === activeModal || modalId === enteringModal,
836
570
 
837
571
  'ModalRoot__modal--dragging': dragging,
838
572
 
@@ -852,4 +586,80 @@ class ModalRootTouchComponent extends React.Component<ModalRootProps & DOMProps,
852
586
  }
853
587
  }
854
588
 
855
- export const ModalRootTouch = withContext(withPlatform(withDOM<ModalRootProps>(ModalRootTouchComponent)), ConfigProviderContext, 'configProvider');
589
+ export const ModalRootTouch = withContext(withPlatform(withDOM<ModalRootProps>(
590
+ withModalManager(initModal)(ModalRootTouchComponent),
591
+ )), ConfigProviderContext, 'configProvider');
592
+
593
+ /**
594
+ * Инициализирует модалку перед анимацией открытия
595
+ */
596
+ function initModal(modalState: ModalsStateEntry) {
597
+ switch (modalState.type) {
598
+ case ModalType.PAGE:
599
+ modalState.settlingHeight = modalState.settlingHeight || MODAL_PAGE_DEFAULT_PERCENT_HEIGHT;
600
+ return initPageModal(modalState);
601
+ case ModalType.CARD:
602
+ return initCardModal(modalState);
603
+ default:
604
+ IS_DEV && warn('[initActiveModal] modalState.type is unknown');
605
+ }
606
+ }
607
+
608
+ function initPageModal(modalState: ModalsStateEntry) {
609
+ const { contentElement } = modalState;
610
+ const contentHeight = (contentElement.firstElementChild as HTMLElement).offsetHeight;
611
+
612
+ let prevTranslateY = modalState.translateY;
613
+
614
+ modalState.expandable = contentHeight > contentElement.clientHeight || modalState.settlingHeight === 100;
615
+
616
+ let collapsed = false;
617
+ let expanded = false;
618
+ let translateYFrom;
619
+ let translateY;
620
+ let expandedRange: TranslateRange;
621
+ let collapsedRange: TranslateRange;
622
+ let hiddenRange: TranslateRange;
623
+
624
+ if (modalState.expandable) {
625
+ translateYFrom = 100 - modalState.settlingHeight;
626
+
627
+ const shiftHalf = translateYFrom / 2;
628
+ const visiblePart = 100 - translateYFrom;
629
+
630
+ expandedRange = [0, shiftHalf];
631
+ collapsedRange = [shiftHalf, translateYFrom + visiblePart / 4];
632
+ hiddenRange = [translateYFrom + visiblePart / 4, 100];
633
+
634
+ collapsed = translateYFrom > 0;
635
+ expanded = translateYFrom <= 0;
636
+ translateY = translateYFrom;
637
+ } else {
638
+ const headerHeight = modalState.headerElement.offsetHeight;
639
+ const height = contentHeight + headerHeight;
640
+
641
+ translateYFrom = 100 - height / modalState.innerElement.parentElement.offsetHeight * 100;
642
+ translateY = translateYFrom;
643
+
644
+ expandedRange = [translateY, translateY + 25];
645
+ collapsedRange = [translateY + 25, translateY + 25];
646
+ hiddenRange = [translateY + 25, translateY + 100];
647
+ }
648
+
649
+ // Если модалка может открываться на весь экран, и новый сдвиг больше предыдущего, то откроем её на весь экран
650
+ if (modalState.expandable && translateY > prevTranslateY || modalState.settlingHeight === 100) {
651
+ translateY = 0;
652
+ }
653
+
654
+ modalState.expandedRange = expandedRange;
655
+ modalState.collapsedRange = collapsedRange;
656
+ modalState.hiddenRange = hiddenRange;
657
+ modalState.translateY = translateY;
658
+ modalState.translateYFrom = translateYFrom;
659
+ modalState.collapsed = collapsed;
660
+ modalState.expanded = expanded;
661
+ }
662
+
663
+ function initCardModal(modalState: ModalsStateEntry) {
664
+ modalState.translateY = 0;
665
+ }