@vkontakte/vkui 4.29.0 → 4.31.0

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 (439) hide show
  1. package/.cache/.eslintcache +1 -1
  2. package/.cache/.stylelintcache +1 -1
  3. package/.cache/.tsbuildinfo +111 -84
  4. package/.cache/ts/src/components/Alert/Alert.d.ts +4 -1
  5. package/.cache/ts/src/components/AppRoot/ScrollContext.d.ts +6 -14
  6. package/.cache/ts/src/components/Calendar/Calendar.d.ts +10 -1
  7. package/.cache/ts/src/components/CalendarHeader/CalendarHeader.d.ts +8 -0
  8. package/.cache/ts/src/components/CalendarRange/CalendarRange.d.ts +1 -1
  9. package/.cache/ts/src/components/ChipsSelect/ChipsSelect.d.ts +1 -1
  10. package/.cache/ts/src/components/CustomSelect/CustomSelect.d.ts +1 -1
  11. package/.cache/ts/src/components/DateInput/DateInput.d.ts +1 -1
  12. package/.cache/ts/src/components/DateRangeInput/DateRangeInput.d.ts +1 -1
  13. package/.cache/ts/src/components/FormField/FormField.d.ts +15 -1
  14. package/.cache/ts/src/components/Input/Input.d.ts +1 -1
  15. package/.cache/ts/src/components/NativeSelect/NativeSelect.d.ts +1 -2
  16. package/.cache/ts/src/components/Select/Select.d.ts +1 -1
  17. package/.cache/ts/src/components/SelectMimicry/SelectMimicry.d.ts +3 -3
  18. package/.cache/ts/src/components/TabbarItem/TabbarItem.d.ts +1 -1
  19. package/.cache/ts/src/hooks/useAdaptivity.d.ts +1 -0
  20. package/.cache/ts/src/hooks/useCalendar.d.ts +4 -3
  21. package/.cache/ts/src/index.d.ts +2 -1
  22. package/dist/cjs/components/ActionSheet/ActionSheet.js +6 -10
  23. package/dist/cjs/components/ActionSheet/ActionSheet.js.map +1 -1
  24. package/dist/cjs/components/ActionSheet/ActionSheetDropdownDesktop.js +1 -1
  25. package/dist/cjs/components/ActionSheet/ActionSheetDropdownDesktop.js.map +1 -1
  26. package/dist/cjs/components/Alert/Alert.d.ts +4 -1
  27. package/dist/cjs/components/Alert/Alert.js +20 -2
  28. package/dist/cjs/components/Alert/Alert.js.map +1 -1
  29. package/dist/cjs/components/AppRoot/AppRoot.js +18 -2
  30. package/dist/cjs/components/AppRoot/AppRoot.js.map +1 -1
  31. package/dist/cjs/components/AppRoot/ScrollContext.d.ts +6 -14
  32. package/dist/cjs/components/AppRoot/ScrollContext.js +94 -2
  33. package/dist/cjs/components/AppRoot/ScrollContext.js.map +1 -1
  34. package/dist/cjs/components/Calendar/Calendar.d.ts +10 -1
  35. package/dist/cjs/components/Calendar/Calendar.js +16 -5
  36. package/dist/cjs/components/Calendar/Calendar.js.map +1 -1
  37. package/dist/cjs/components/CalendarHeader/CalendarHeader.d.ts +8 -0
  38. package/dist/cjs/components/CalendarHeader/CalendarHeader.js +15 -9
  39. package/dist/cjs/components/CalendarHeader/CalendarHeader.js.map +1 -1
  40. package/dist/cjs/components/CalendarRange/CalendarRange.d.ts +1 -1
  41. package/dist/cjs/components/CalendarRange/CalendarRange.js +7 -3
  42. package/dist/cjs/components/CalendarRange/CalendarRange.js.map +1 -1
  43. package/dist/cjs/components/ChipsInput/ChipsInput.js +3 -1
  44. package/dist/cjs/components/ChipsInput/ChipsInput.js.map +1 -1
  45. package/dist/cjs/components/ChipsSelect/ChipsSelect.d.ts +1 -1
  46. package/dist/cjs/components/ConfigProvider/ConfigProvider.js +1 -1
  47. package/dist/cjs/components/ConfigProvider/ConfigProvider.js.map +1 -1
  48. package/dist/cjs/components/CustomSelect/CustomSelect.d.ts +1 -1
  49. package/dist/cjs/components/CustomSelect/CustomSelect.js +6 -3
  50. package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
  51. package/dist/cjs/components/DateInput/DateInput.d.ts +1 -1
  52. package/dist/cjs/components/DateInput/DateInput.js +14 -2
  53. package/dist/cjs/components/DateInput/DateInput.js.map +1 -1
  54. package/dist/cjs/components/DateRangeInput/DateRangeInput.d.ts +1 -1
  55. package/dist/cjs/components/DateRangeInput/DateRangeInput.js +6 -2
  56. package/dist/cjs/components/DateRangeInput/DateRangeInput.js.map +1 -1
  57. package/dist/cjs/components/Epic/Epic.js +1 -1
  58. package/dist/cjs/components/Epic/Epic.js.map +1 -1
  59. package/dist/cjs/components/FormField/FormField.d.ts +15 -1
  60. package/dist/cjs/components/FormField/FormField.js +6 -2
  61. package/dist/cjs/components/FormField/FormField.js.map +1 -1
  62. package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js +12 -3
  63. package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  64. package/dist/cjs/components/Input/Input.d.ts +1 -1
  65. package/dist/cjs/components/Input/Input.js +3 -1
  66. package/dist/cjs/components/Input/Input.js.map +1 -1
  67. package/dist/cjs/components/ModalCard/ModalCard.js +3 -1
  68. package/dist/cjs/components/ModalCard/ModalCard.js.map +1 -1
  69. package/dist/cjs/components/ModalCardBase/ModalCardBase.js +4 -2
  70. package/dist/cjs/components/ModalCardBase/ModalCardBase.js.map +1 -1
  71. package/dist/cjs/components/ModalPage/ModalPage.js +6 -2
  72. package/dist/cjs/components/ModalPage/ModalPage.js.map +1 -1
  73. package/dist/cjs/components/ModalPageHeader/ModalPageHeader.js +2 -10
  74. package/dist/cjs/components/ModalPageHeader/ModalPageHeader.js.map +1 -1
  75. package/dist/cjs/components/ModalRoot/ModalRoot.js +2 -2
  76. package/dist/cjs/components/ModalRoot/ModalRoot.js.map +1 -1
  77. package/dist/cjs/components/ModalRoot/ModalRootAdaptive.js +6 -4
  78. package/dist/cjs/components/ModalRoot/ModalRootAdaptive.js.map +1 -1
  79. package/dist/cjs/components/ModalRoot/useModalManager.js +1 -1
  80. package/dist/cjs/components/ModalRoot/useModalManager.js.map +1 -1
  81. package/dist/cjs/components/NativeSelect/NativeSelect.d.ts +1 -2
  82. package/dist/cjs/components/NativeSelect/NativeSelect.js +5 -7
  83. package/dist/cjs/components/NativeSelect/NativeSelect.js.map +1 -1
  84. package/dist/cjs/components/PanelHeader/PanelHeader.js +6 -4
  85. package/dist/cjs/components/PanelHeader/PanelHeader.js.map +1 -1
  86. package/dist/cjs/components/PanelHeaderContext/PanelHeaderContext.js +4 -1
  87. package/dist/cjs/components/PanelHeaderContext/PanelHeaderContext.js.map +1 -1
  88. package/dist/cjs/components/PopoutRoot/PopoutRoot.js +3 -1
  89. package/dist/cjs/components/PopoutRoot/PopoutRoot.js.map +1 -1
  90. package/dist/cjs/components/ScreenSpinner/ScreenSpinner.js +3 -0
  91. package/dist/cjs/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
  92. package/dist/cjs/components/Select/Select.d.ts +1 -1
  93. package/dist/cjs/components/Select/Select.js +2 -2
  94. package/dist/cjs/components/Select/Select.js.map +1 -1
  95. package/dist/cjs/components/SelectMimicry/SelectMimicry.d.ts +3 -3
  96. package/dist/cjs/components/SelectMimicry/SelectMimicry.js +3 -1
  97. package/dist/cjs/components/SelectMimicry/SelectMimicry.js.map +1 -1
  98. package/dist/cjs/components/TabbarItem/TabbarItem.d.ts +1 -1
  99. package/dist/cjs/components/TabbarItem/TabbarItem.js.map +1 -1
  100. package/dist/cjs/components/Tooltip/Tooltip.js +1 -1
  101. package/dist/cjs/components/Tooltip/Tooltip.js.map +1 -1
  102. package/dist/cjs/components/Typography/Text/Text.js +1 -1
  103. package/dist/cjs/components/Typography/Text/Text.js.map +1 -1
  104. package/dist/cjs/hooks/useAdaptivity.d.ts +1 -0
  105. package/dist/cjs/hooks/useAdaptivity.js +18 -1
  106. package/dist/cjs/hooks/useAdaptivity.js.map +1 -1
  107. package/dist/cjs/hooks/useCalendar.d.ts +4 -3
  108. package/dist/cjs/hooks/useCalendar.js +15 -6
  109. package/dist/cjs/hooks/useCalendar.js.map +1 -1
  110. package/dist/cjs/index.d.ts +2 -1
  111. package/dist/cjs/index.js +10 -2
  112. package/dist/cjs/index.js.map +1 -1
  113. package/dist/cjs/lib/getNavId.js +1 -1
  114. package/dist/cjs/lib/getNavId.js.map +1 -1
  115. package/dist/cjs/lib/platform.js +29 -0
  116. package/dist/cjs/lib/platform.js.map +1 -1
  117. package/dist/components/ActionSheet/ActionSheet.js +5 -9
  118. package/dist/components/ActionSheet/ActionSheet.js.map +1 -1
  119. package/dist/components/ActionSheet/ActionSheetDropdownDesktop.js +1 -1
  120. package/dist/components/ActionSheet/ActionSheetDropdownDesktop.js.map +1 -1
  121. package/dist/components/Alert/Alert.d.ts +4 -1
  122. package/dist/components/Alert/Alert.js +18 -2
  123. package/dist/components/Alert/Alert.js.map +1 -1
  124. package/dist/components/AppRoot/AppRoot.js +17 -2
  125. package/dist/components/AppRoot/AppRoot.js.map +1 -1
  126. package/dist/components/AppRoot/ScrollContext.d.ts +6 -14
  127. package/dist/components/AppRoot/ScrollContext.js +87 -1
  128. package/dist/components/AppRoot/ScrollContext.js.map +1 -1
  129. package/dist/components/Calendar/Calendar.d.ts +10 -1
  130. package/dist/components/Calendar/Calendar.js +16 -5
  131. package/dist/components/Calendar/Calendar.js.map +1 -1
  132. package/dist/components/CalendarHeader/CalendarHeader.d.ts +8 -0
  133. package/dist/components/CalendarHeader/CalendarHeader.js +15 -9
  134. package/dist/components/CalendarHeader/CalendarHeader.js.map +1 -1
  135. package/dist/components/CalendarRange/CalendarRange.d.ts +1 -1
  136. package/dist/components/CalendarRange/CalendarRange.js +7 -3
  137. package/dist/components/CalendarRange/CalendarRange.js.map +1 -1
  138. package/dist/components/ChipsInput/ChipsInput.js +3 -1
  139. package/dist/components/ChipsInput/ChipsInput.js.map +1 -1
  140. package/dist/components/ChipsSelect/ChipsSelect.d.ts +1 -1
  141. package/dist/components/ConfigProvider/ConfigProvider.js +1 -1
  142. package/dist/components/ConfigProvider/ConfigProvider.js.map +1 -1
  143. package/dist/components/CustomSelect/CustomSelect.d.ts +1 -1
  144. package/dist/components/CustomSelect/CustomSelect.js +6 -3
  145. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  146. package/dist/components/DateInput/DateInput.d.ts +1 -1
  147. package/dist/components/DateInput/DateInput.js +14 -2
  148. package/dist/components/DateInput/DateInput.js.map +1 -1
  149. package/dist/components/DateRangeInput/DateRangeInput.d.ts +1 -1
  150. package/dist/components/DateRangeInput/DateRangeInput.js +6 -2
  151. package/dist/components/DateRangeInput/DateRangeInput.js.map +1 -1
  152. package/dist/components/Epic/Epic.js +1 -1
  153. package/dist/components/Epic/Epic.js.map +1 -1
  154. package/dist/components/FormField/FormField.d.ts +15 -1
  155. package/dist/components/FormField/FormField.js +6 -2
  156. package/dist/components/FormField/FormField.js.map +1 -1
  157. package/dist/components/HorizontalScroll/HorizontalScroll.js +12 -3
  158. package/dist/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  159. package/dist/components/Input/Input.d.ts +1 -1
  160. package/dist/components/Input/Input.js +3 -1
  161. package/dist/components/Input/Input.js.map +1 -1
  162. package/dist/components/ModalCard/ModalCard.js +3 -2
  163. package/dist/components/ModalCard/ModalCard.js.map +1 -1
  164. package/dist/components/ModalCardBase/ModalCardBase.js +5 -4
  165. package/dist/components/ModalCardBase/ModalCardBase.js.map +1 -1
  166. package/dist/components/ModalPage/ModalPage.js +5 -3
  167. package/dist/components/ModalPage/ModalPage.js.map +1 -1
  168. package/dist/components/ModalPageHeader/ModalPageHeader.js +2 -9
  169. package/dist/components/ModalPageHeader/ModalPageHeader.js.map +1 -1
  170. package/dist/components/ModalRoot/ModalRoot.js +2 -2
  171. package/dist/components/ModalRoot/ModalRoot.js.map +1 -1
  172. package/dist/components/ModalRoot/ModalRootAdaptive.js +5 -5
  173. package/dist/components/ModalRoot/ModalRootAdaptive.js.map +1 -1
  174. package/dist/components/ModalRoot/useModalManager.js +1 -1
  175. package/dist/components/ModalRoot/useModalManager.js.map +1 -1
  176. package/dist/components/NativeSelect/NativeSelect.d.ts +1 -2
  177. package/dist/components/NativeSelect/NativeSelect.js +3 -4
  178. package/dist/components/NativeSelect/NativeSelect.js.map +1 -1
  179. package/dist/components/PanelHeader/PanelHeader.js +6 -4
  180. package/dist/components/PanelHeader/PanelHeader.js.map +1 -1
  181. package/dist/components/PanelHeaderContext/PanelHeaderContext.js +3 -1
  182. package/dist/components/PanelHeaderContext/PanelHeaderContext.js.map +1 -1
  183. package/dist/components/PopoutRoot/PopoutRoot.js +3 -2
  184. package/dist/components/PopoutRoot/PopoutRoot.js.map +1 -1
  185. package/dist/components/ScreenSpinner/ScreenSpinner.js +2 -0
  186. package/dist/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
  187. package/dist/components/Select/Select.d.ts +1 -1
  188. package/dist/components/Select/Select.js +1 -1
  189. package/dist/components/Select/Select.js.map +1 -1
  190. package/dist/components/SelectMimicry/SelectMimicry.d.ts +3 -3
  191. package/dist/components/SelectMimicry/SelectMimicry.js +3 -1
  192. package/dist/components/SelectMimicry/SelectMimicry.js.map +1 -1
  193. package/dist/components/TabbarItem/TabbarItem.d.ts +1 -1
  194. package/dist/components/TabbarItem/TabbarItem.js.map +1 -1
  195. package/dist/components/Tooltip/Tooltip.js +1 -1
  196. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  197. package/dist/components/Typography/Text/Text.js +1 -1
  198. package/dist/components/Typography/Text/Text.js.map +1 -1
  199. package/dist/components.css +18 -18
  200. package/dist/components.css.map +1 -1
  201. package/dist/cssm/components/ActionSheet/ActionSheet.js +5 -9
  202. package/dist/cssm/components/ActionSheet/ActionSheet.js.map +1 -1
  203. package/dist/cssm/components/ActionSheet/ActionSheetDropdownDesktop.js +1 -1
  204. package/dist/cssm/components/ActionSheet/ActionSheetDropdownDesktop.js.map +1 -1
  205. package/dist/cssm/components/Alert/Alert.d.ts +4 -1
  206. package/dist/cssm/components/Alert/Alert.js +18 -2
  207. package/dist/cssm/components/Alert/Alert.js.map +1 -1
  208. package/dist/cssm/components/AppRoot/AppRoot.js +17 -2
  209. package/dist/cssm/components/AppRoot/AppRoot.js.map +1 -1
  210. package/dist/cssm/components/AppRoot/ScrollContext.d.ts +6 -14
  211. package/dist/cssm/components/AppRoot/ScrollContext.js +87 -1
  212. package/dist/cssm/components/AppRoot/ScrollContext.js.map +1 -1
  213. package/dist/cssm/components/Button/Button.css +9 -9
  214. package/dist/cssm/components/ButtonGroup/ButtonGroup.css +1 -1
  215. package/dist/cssm/components/Calendar/Calendar.css +1 -1
  216. package/dist/cssm/components/Calendar/Calendar.d.ts +10 -1
  217. package/dist/cssm/components/Calendar/Calendar.js +16 -5
  218. package/dist/cssm/components/Calendar/Calendar.js.map +1 -1
  219. package/dist/cssm/components/CalendarDay/CalendarDay.css +1 -1
  220. package/dist/cssm/components/CalendarDays/CalendarDays.css +1 -1
  221. package/dist/cssm/components/CalendarHeader/CalendarHeader.css +1 -1
  222. package/dist/cssm/components/CalendarHeader/CalendarHeader.d.ts +8 -0
  223. package/dist/cssm/components/CalendarHeader/CalendarHeader.js +15 -9
  224. package/dist/cssm/components/CalendarHeader/CalendarHeader.js.map +1 -1
  225. package/dist/cssm/components/CalendarRange/CalendarRange.css +1 -1
  226. package/dist/cssm/components/CalendarRange/CalendarRange.d.ts +1 -1
  227. package/dist/cssm/components/CalendarRange/CalendarRange.js +7 -3
  228. package/dist/cssm/components/CalendarRange/CalendarRange.js.map +1 -1
  229. package/dist/cssm/components/CalendarTime/CalendarTime.css +1 -1
  230. package/dist/cssm/components/Card/Card.css +2 -2
  231. package/dist/cssm/components/CardScroll/CardScroll.css +1 -1
  232. package/dist/cssm/components/Cell/Cell.css +1 -1
  233. package/dist/cssm/components/CellButton/CellButton.css +1 -1
  234. package/dist/cssm/components/Checkbox/Checkbox.css +1 -1
  235. package/dist/cssm/components/ChipsInput/ChipsInput.css +1 -1
  236. package/dist/cssm/components/ChipsInput/ChipsInput.js +3 -1
  237. package/dist/cssm/components/ChipsInput/ChipsInput.js.map +1 -1
  238. package/dist/cssm/components/ChipsSelect/ChipsSelect.d.ts +1 -1
  239. package/dist/cssm/components/ConfigProvider/ConfigProvider.js +1 -1
  240. package/dist/cssm/components/ConfigProvider/ConfigProvider.js.map +1 -1
  241. package/dist/cssm/components/CustomSelect/CustomSelect.d.ts +1 -1
  242. package/dist/cssm/components/CustomSelect/CustomSelect.js +6 -3
  243. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  244. package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.css +1 -1
  245. package/dist/cssm/components/CustomSelectOption/CustomSelectOption.css +1 -1
  246. package/dist/cssm/components/DateInput/DateInput.d.ts +1 -1
  247. package/dist/cssm/components/DateInput/DateInput.js +14 -2
  248. package/dist/cssm/components/DateInput/DateInput.js.map +1 -1
  249. package/dist/cssm/components/DateRangeInput/DateRangeInput.d.ts +1 -1
  250. package/dist/cssm/components/DateRangeInput/DateRangeInput.js +6 -2
  251. package/dist/cssm/components/DateRangeInput/DateRangeInput.js.map +1 -1
  252. package/dist/cssm/components/Epic/Epic.js +1 -1
  253. package/dist/cssm/components/Epic/Epic.js.map +1 -1
  254. package/dist/cssm/components/FormField/FormField.css +3 -3
  255. package/dist/cssm/components/FormField/FormField.d.ts +15 -1
  256. package/dist/cssm/components/FormField/FormField.js +6 -2
  257. package/dist/cssm/components/FormField/FormField.js.map +1 -1
  258. package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.css +1 -1
  259. package/dist/cssm/components/Gradient/Gradient.css +1 -1
  260. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js +12 -3
  261. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  262. package/dist/cssm/components/HorizontalScroll/HorizontalScrollArrow.css +1 -1
  263. package/dist/cssm/components/Input/Input.css +1 -1
  264. package/dist/cssm/components/Input/Input.d.ts +1 -1
  265. package/dist/cssm/components/Input/Input.js +3 -1
  266. package/dist/cssm/components/Input/Input.js.map +1 -1
  267. package/dist/cssm/components/InputLike/InputLike.css +1 -1
  268. package/dist/cssm/components/InputLike/InputLikeDivider.css +1 -1
  269. package/dist/cssm/components/ModalCard/ModalCard.css +1 -1
  270. package/dist/cssm/components/ModalCard/ModalCard.js +3 -2
  271. package/dist/cssm/components/ModalCard/ModalCard.js.map +1 -1
  272. package/dist/cssm/components/ModalCardBase/ModalCardBase.js +5 -4
  273. package/dist/cssm/components/ModalCardBase/ModalCardBase.js.map +1 -1
  274. package/dist/cssm/components/ModalPage/ModalPage.js +5 -3
  275. package/dist/cssm/components/ModalPage/ModalPage.js.map +1 -1
  276. package/dist/cssm/components/ModalPageHeader/ModalPageHeader.js +2 -9
  277. package/dist/cssm/components/ModalPageHeader/ModalPageHeader.js.map +1 -1
  278. package/dist/cssm/components/ModalRoot/ModalRoot.css +1 -1
  279. package/dist/cssm/components/ModalRoot/ModalRoot.js +2 -2
  280. package/dist/cssm/components/ModalRoot/ModalRoot.js.map +1 -1
  281. package/dist/cssm/components/ModalRoot/ModalRootAdaptive.js +5 -5
  282. package/dist/cssm/components/ModalRoot/ModalRootAdaptive.js.map +1 -1
  283. package/dist/cssm/components/ModalRoot/useModalManager.js +1 -1
  284. package/dist/cssm/components/ModalRoot/useModalManager.js.map +1 -1
  285. package/dist/cssm/components/NativeSelect/NativeSelect.d.ts +1 -2
  286. package/dist/cssm/components/NativeSelect/NativeSelect.js +3 -4
  287. package/dist/cssm/components/NativeSelect/NativeSelect.js.map +1 -1
  288. package/dist/cssm/components/Pagination/Pagination.css +1 -1
  289. package/dist/cssm/components/PanelHeader/PanelHeader.css +1 -1
  290. package/dist/cssm/components/PanelHeader/PanelHeader.js +6 -4
  291. package/dist/cssm/components/PanelHeader/PanelHeader.js.map +1 -1
  292. package/dist/cssm/components/PanelHeaderContext/PanelHeaderContext.js +3 -1
  293. package/dist/cssm/components/PanelHeaderContext/PanelHeaderContext.js.map +1 -1
  294. package/dist/cssm/components/PopoutRoot/PopoutRoot.js +3 -2
  295. package/dist/cssm/components/PopoutRoot/PopoutRoot.js.map +1 -1
  296. package/dist/cssm/components/Popper/Popper.css +1 -1
  297. package/dist/cssm/components/Radio/Radio.css +1 -1
  298. package/dist/cssm/components/RadioGroup/RadioGroup.css +1 -1
  299. package/dist/cssm/components/Removable/Removable.css +1 -1
  300. package/dist/cssm/components/RichCell/RichCell.css +1 -1
  301. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.js +2 -0
  302. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
  303. package/dist/cssm/components/SegmentedControl/SegmentedControl.css +1 -1
  304. package/dist/cssm/components/SegmentedControl/SegmentedControlOption/SegmentedControlOption.css +1 -1
  305. package/dist/cssm/components/Select/Select.d.ts +1 -1
  306. package/dist/cssm/components/Select/Select.js +1 -1
  307. package/dist/cssm/components/Select/Select.js.map +1 -1
  308. package/dist/cssm/components/SelectMimicry/SelectMimicry.d.ts +3 -3
  309. package/dist/cssm/components/SelectMimicry/SelectMimicry.js +3 -1
  310. package/dist/cssm/components/SelectMimicry/SelectMimicry.js.map +1 -1
  311. package/dist/cssm/components/SimpleCell/SimpleCell.css +1 -1
  312. package/dist/cssm/components/Snackbar/Snackbar.css +1 -1
  313. package/dist/cssm/components/SplitLayout/SplitLayout.css +1 -1
  314. package/dist/cssm/components/TabbarItem/TabbarItem.d.ts +1 -1
  315. package/dist/cssm/components/TabbarItem/TabbarItem.js.map +1 -1
  316. package/dist/cssm/components/Tooltip/Tooltip.js +1 -1
  317. package/dist/cssm/components/Tooltip/Tooltip.js.map +1 -1
  318. package/dist/cssm/components/Typography/Caption/Caption.css +1 -1
  319. package/dist/cssm/components/Typography/Paragraph/Paragraph.css +1 -1
  320. package/dist/cssm/components/Typography/Subhead/Subhead.css +1 -1
  321. package/dist/cssm/components/Typography/Text/Text.js +1 -1
  322. package/dist/cssm/components/Typography/Text/Text.js.map +1 -1
  323. package/dist/cssm/components/Typography/Title/Title.css +1 -1
  324. package/dist/cssm/hooks/useAdaptivity.d.ts +1 -0
  325. package/dist/cssm/hooks/useAdaptivity.js +13 -1
  326. package/dist/cssm/hooks/useAdaptivity.js.map +1 -1
  327. package/dist/cssm/hooks/useCalendar.d.ts +4 -3
  328. package/dist/cssm/hooks/useCalendar.js +15 -6
  329. package/dist/cssm/hooks/useCalendar.js.map +1 -1
  330. package/dist/cssm/index.d.ts +2 -1
  331. package/dist/cssm/index.js +2 -1
  332. package/dist/cssm/index.js.map +1 -1
  333. package/dist/cssm/lib/getNavId.js +1 -1
  334. package/dist/cssm/lib/getNavId.js.map +1 -1
  335. package/dist/cssm/lib/platform.js +26 -0
  336. package/dist/cssm/lib/platform.js.map +1 -1
  337. package/dist/cssm/styles/bright_light.css +1 -1
  338. package/dist/cssm/styles/components.css +18 -18
  339. package/dist/cssm/styles/constants.css +1 -1
  340. package/dist/cssm/styles/space_gray.css +1 -1
  341. package/dist/cssm/styles/themes.css +3 -3
  342. package/dist/cssm/styles/vkcom_dark.css +2 -2
  343. package/dist/cssm/styles/vkcom_light.css +1 -1
  344. package/dist/default_scheme.css +1 -1
  345. package/dist/default_scheme.css.map +1 -1
  346. package/dist/hooks/useAdaptivity.d.ts +1 -0
  347. package/dist/hooks/useAdaptivity.js +13 -1
  348. package/dist/hooks/useAdaptivity.js.map +1 -1
  349. package/dist/hooks/useCalendar.d.ts +4 -3
  350. package/dist/hooks/useCalendar.js +15 -6
  351. package/dist/hooks/useCalendar.js.map +1 -1
  352. package/dist/index.d.ts +2 -1
  353. package/dist/index.js +2 -1
  354. package/dist/index.js.map +1 -1
  355. package/dist/lib/getNavId.js +1 -1
  356. package/dist/lib/getNavId.js.map +1 -1
  357. package/dist/lib/platform.js +26 -0
  358. package/dist/lib/platform.js.map +1 -1
  359. package/dist/vkui.css +21 -21
  360. package/dist/vkui.css.map +1 -1
  361. package/jest.unit.config.js +1 -0
  362. package/package.json +5 -3
  363. package/postcss-custom-properties-fallback/__tests__/custom_properties.css +5 -0
  364. package/postcss-custom-properties-fallback/index.js +83 -0
  365. package/postcss-plugin-vk-sans/index.js +34 -27
  366. package/src/components/ActionSheet/ActionSheet.tsx +9 -7
  367. package/src/components/ActionSheet/ActionSheetDropdownDesktop.tsx +1 -1
  368. package/src/components/ActionSheet/Readme.md +1 -0
  369. package/src/components/Alert/Alert.tsx +23 -4
  370. package/src/components/AppRoot/AppRoot.tsx +17 -2
  371. package/src/components/AppRoot/ScrollContext.ts +90 -2
  372. package/src/components/Button/Button.css +2 -0
  373. package/src/components/Calendar/Calendar.tsx +32 -3
  374. package/src/components/CalendarHeader/CalendarHeader.css +3 -0
  375. package/src/components/CalendarHeader/CalendarHeader.tsx +24 -2
  376. package/src/components/CalendarRange/CalendarRange.tsx +6 -0
  377. package/src/components/Card/Card.css +2 -1
  378. package/src/components/Cell/Cell.css +1 -1
  379. package/src/components/CellButton/CellButton.css +1 -1
  380. package/src/components/Checkbox/Checkbox.css +1 -1
  381. package/src/components/ChipsInput/ChipsInput.tsx +2 -0
  382. package/src/components/ConfigProvider/ConfigProvider.tsx +1 -1
  383. package/src/components/CustomSelect/CustomSelect.tsx +6 -3
  384. package/src/components/DateInput/DateInput.tsx +18 -0
  385. package/src/components/DateRangeInput/DateRangeInput.tsx +6 -0
  386. package/src/components/Epic/Epic.tsx +3 -1
  387. package/src/components/FixedLayout/FixedLayout.css +10 -0
  388. package/src/components/FormField/FormField.css +10 -0
  389. package/src/components/FormField/FormField.tsx +21 -1
  390. package/src/components/FormField/Readme.md +85 -19
  391. package/src/components/FormItem/FormItem.css +1 -0
  392. package/src/components/FormLayoutGroup/FormLayoutGroup.css +2 -1
  393. package/src/components/Gradient/Gradient.css +4 -2
  394. package/src/components/HorizontalScroll/HorizontalScroll.tsx +9 -3
  395. package/src/components/Input/Input.tsx +2 -0
  396. package/src/components/ModalCard/ModalCard.css +1 -1
  397. package/src/components/ModalCard/ModalCard.tsx +3 -8
  398. package/src/components/ModalCardBase/ModalCardBase.tsx +6 -10
  399. package/src/components/ModalPage/ModalPage.tsx +6 -9
  400. package/src/components/ModalPageHeader/ModalPageHeader.tsx +2 -6
  401. package/src/components/ModalRoot/ModalRoot.css +3 -2
  402. package/src/components/ModalRoot/ModalRoot.tsx +6 -2
  403. package/src/components/ModalRoot/ModalRootAdaptive.tsx +6 -9
  404. package/src/components/ModalRoot/Readme.md +1 -1
  405. package/src/components/ModalRoot/useModalManager.tsx +4 -1
  406. package/src/components/NativeSelect/NativeSelect.tsx +2 -3
  407. package/src/components/PanelHeader/PanelHeader.css +13 -13
  408. package/src/components/PanelHeader/PanelHeader.tsx +18 -17
  409. package/src/components/PanelHeader/Readme.md +2 -2
  410. package/src/components/PanelHeaderContext/PanelHeaderContext.tsx +3 -0
  411. package/src/components/PopoutRoot/PopoutRoot.tsx +3 -8
  412. package/src/components/Popper/Popper.css +14 -2
  413. package/src/components/Radio/Radio.css +1 -1
  414. package/src/components/RadioGroup/RadioGroup.css +1 -1
  415. package/src/components/Removable/Removable.css +2 -2
  416. package/src/components/RichCell/RichCell.css +1 -1
  417. package/src/components/ScreenSpinner/ScreenSpinner.tsx +3 -0
  418. package/src/components/Select/Select.tsx +1 -1
  419. package/src/components/SelectMimicry/SelectMimicry.tsx +5 -3
  420. package/src/components/SimpleCell/SimpleCell.css +1 -1
  421. package/src/components/Snackbar/Snackbar.css +6 -3
  422. package/src/components/SplitLayout/SplitLayout.css +3 -1
  423. package/src/components/Switch/Readme.md +12 -36
  424. package/src/components/TabbarItem/TabbarItem.tsx +1 -1
  425. package/src/components/Tooltip/Readme.md +35 -47
  426. package/src/components/Tooltip/Tooltip.tsx +2 -2
  427. package/src/components/Typography/Text/Text.tsx +4 -1
  428. package/src/hooks/useAdaptivity.ts +15 -0
  429. package/src/hooks/useCalendar.ts +25 -9
  430. package/src/index.ts +2 -1
  431. package/src/lib/getNavId.ts +1 -1
  432. package/src/lib/platform.ts +34 -0
  433. package/src/styles/bright_light.css +2 -0
  434. package/src/styles/constants.css +3 -2
  435. package/src/styles/space_gray.css +10 -8
  436. package/src/styles/vkcom_dark.css +6 -4
  437. package/src/styles/vkcom_light.css +4 -2
  438. package/src/testing/utils.tsx +5 -1
  439. package/tsconfig.json +1 -0
@@ -4,6 +4,7 @@ module.exports = {
4
4
  roots: [
5
5
  path.join(__dirname, "src"),
6
6
  path.join(__dirname, "postcss-plugin-vk-sans"),
7
+ path.join(__dirname, "postcss-custom-properties-fallback"),
7
8
  ],
8
9
  setupFilesAfterEnv: [path.join(__dirname, "src/testing/setup.ts")],
9
10
  collectCoverage: true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vkontakte/vkui",
3
- "version": "4.29.0",
3
+ "version": "4.31.0",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/index.js",
6
6
  "typings": "dist/index.d.ts",
@@ -43,11 +43,11 @@
43
43
  "@types/webpack-dev-server": "^3.11.2",
44
44
  "@typescript-eslint/eslint-plugin": "^2.28.0",
45
45
  "@typescript-eslint/parser": "^2.0.0",
46
- "@vkontakte/appearance": "https://github.com/VKCOM/Appearance#v9.29.0",
46
+ "@vkontakte/appearance": "https://github.com/VKCOM/Appearance#v9.40.4",
47
47
  "@vkontakte/eslint-config": "2.5.0",
48
48
  "@vkontakte/icons": "^1.145.1",
49
49
  "@vkontakte/vk-bridge": "^2.1.3",
50
- "@vkontakte/vkui-tokens": "4.7.0",
50
+ "@vkontakte/vkui-tokens": "4.10.0",
51
51
  "autoprefixer": "^10.4.2",
52
52
  "babel-jest": "^26.6.3",
53
53
  "babel-loader": "^8.2.3",
@@ -86,6 +86,8 @@
86
86
  "postcss-import": "^14.0.2",
87
87
  "postcss-loader": "^6.2.1",
88
88
  "postcss-modules": "^4.3.0",
89
+ "postcss-value-parser": "^4.2.0",
90
+ "postcss-values-parser": "^6.0.2",
89
91
  "prettier": "^2.5.1",
90
92
  "process": "^0.11.10",
91
93
  "prop-types": "^15.6.2",
@@ -0,0 +1,5 @@
1
+ /* stylelint-disable-next-line vkui/atomic */
2
+ :root {
3
+ --color: red;
4
+ --shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);
5
+ }
@@ -0,0 +1,83 @@
1
+ /* stylelint-disable */
2
+ const fs = require("fs");
3
+ const valueParser = require("postcss-value-parser");
4
+ const { nodeToString, parse: parseValues } = require("postcss-values-parser");
5
+ const { parse } = require("postcss");
6
+
7
+ const isTransformableDecl = (decl) =>
8
+ /(^|[^\w-])var\([\W\w]+\)/.test(decl.value);
9
+
10
+ function parseCustomProperties(importFrom) {
11
+ const customProperties = new Map();
12
+
13
+ parse(fs.readFileSync(importFrom, "utf8")).walkRules((rule) => {
14
+ if (rule.selector === ":root") {
15
+ rule.walkDecls((decl) => {
16
+ if (decl.prop.startsWith("--")) {
17
+ customProperties.set(
18
+ decl.prop,
19
+ parseValues(String(decl.value)).nodes
20
+ );
21
+ }
22
+ });
23
+ }
24
+ });
25
+
26
+ return customProperties;
27
+ }
28
+
29
+ module.exports = (opts) => {
30
+ return {
31
+ postcssPlugin: "custom-properties-fallback",
32
+ prepare() {
33
+ const customProperties = parseCustomProperties(opts.importFrom);
34
+ const shouldTransformableDecl =
35
+ opts.shouldTransformableDecl || isTransformableDecl;
36
+
37
+ return {
38
+ Declaration(node) {
39
+ if (shouldTransformableDecl(node)) {
40
+ const parsed = valueParser(node.value);
41
+
42
+ parsed.walk((node) => {
43
+ if (node.type !== "function" || node.nodes.length !== 1) {
44
+ return;
45
+ }
46
+
47
+ const firstValue = node.nodes[0].value;
48
+
49
+ if (
50
+ !customProperties.has(firstValue) ||
51
+ customProperties.get(firstValue).length === 0
52
+ ) {
53
+ return;
54
+ }
55
+
56
+ const fallback = customProperties.get(firstValue);
57
+
58
+ node.nodes.push(
59
+ {
60
+ type: "divider",
61
+ value: ",",
62
+ },
63
+ {
64
+ type: "word",
65
+ value:
66
+ fallback.length > 1
67
+ ? fallback
68
+ .map((fallbackNode) => nodeToString(fallbackNode))
69
+ .join(" ")
70
+ : fallback,
71
+ }
72
+ );
73
+ });
74
+
75
+ node.value = parsed.toString();
76
+ }
77
+ },
78
+ };
79
+ },
80
+ };
81
+ };
82
+
83
+ module.exports.postcss = true;
@@ -1,5 +1,4 @@
1
1
  /* stylelint-disable */
2
- const postcss = require("postcss");
3
2
  const fs = require("fs");
4
3
  const path = require("path");
5
4
 
@@ -88,14 +87,18 @@ const updateFontSizeStats = (value = "", platform) => {
88
87
  return ++cache.fontSizeUsages[value];
89
88
  };
90
89
 
91
- const extendConfigWithCustomProperties = (customPropertiesFile, platform) => {
90
+ const extendConfigWithCustomProperties = (
91
+ customPropertiesFile,
92
+ platform,
93
+ parse
94
+ ) => {
92
95
  const customProperties = fs.readFileSync(
93
96
  path.resolve(customPropertiesFile),
94
97
  "utf8"
95
98
  );
96
99
  const customPropertiesValues = {};
97
100
 
98
- postcss.parse(customProperties).walkRules((rule) => {
101
+ parse(customProperties).walkRules((rule) => {
99
102
  if (
100
103
  rule.parent.type === "root" &&
101
104
  rule.type === "rule" &&
@@ -153,38 +156,42 @@ const initializeConfig = (platform, overrides) => {
153
156
  }
154
157
  };
155
158
 
156
- const initializeCustomPropertiesFiles = (customPropertiesFiles, platform) => {
159
+ const initializeCustomPropertiesFiles = (
160
+ customPropertiesFiles,
161
+ platform,
162
+ parse
163
+ ) => {
157
164
  customPropertiesFiles.forEach((i) => {
158
165
  if (!initializedCustomPropertiesFiles.has(i)) {
159
- extendConfigWithCustomProperties(i, platform);
166
+ extendConfigWithCustomProperties(i, platform, parse);
160
167
  initializedCustomPropertiesFiles.add(i);
161
168
  }
162
169
  });
163
170
  };
164
171
 
165
- const VkSansMandatoryDeclarations = postcss.plugin(
166
- "vk-sans-mandatory-declarations",
167
- (opts) => {
168
- const {
169
- debug,
170
- overrides,
171
- platform = "test",
172
- features = defaultFeatures,
173
- customPropertiesFiles,
174
- ignoreFiles,
175
- ignoreSelectors,
176
- explicitNormalLetterSpacing,
177
- respectImportant,
178
- varName = "--palette-vk-font",
179
- } = opts;
180
-
181
- return (css) => {
172
+ module.exports = (opts) => {
173
+ const {
174
+ debug,
175
+ overrides,
176
+ platform = "test",
177
+ features = defaultFeatures,
178
+ customPropertiesFiles,
179
+ ignoreFiles,
180
+ ignoreSelectors,
181
+ explicitNormalLetterSpacing,
182
+ respectImportant,
183
+ varName = "--palette-vk-font",
184
+ } = opts;
185
+
186
+ return {
187
+ postcssPlugin: "vk-sans-mandatory-declarations",
188
+ Once(css, { parse }) {
182
189
  if (!cache.config[platform]) {
183
190
  initializeConfig(platform, overrides);
184
191
  }
185
192
 
186
193
  if (customPropertiesFiles) {
187
- initializeCustomPropertiesFiles(customPropertiesFiles, platform);
194
+ initializeCustomPropertiesFiles(customPropertiesFiles, platform, parse);
188
195
  }
189
196
 
190
197
  if (
@@ -336,8 +343,8 @@ const VkSansMandatoryDeclarations = postcss.plugin(
336
343
  }
337
344
  });
338
345
  }
339
- };
340
- }
341
- );
346
+ },
347
+ };
348
+ };
342
349
 
343
- module.exports = VkSansMandatoryDeclarations;
350
+ module.exports.postcss = true;
@@ -1,6 +1,5 @@
1
1
  import * as React from "react";
2
2
  import { PopoutWrapper } from "../PopoutWrapper/PopoutWrapper";
3
- import { ViewWidth, ViewHeight } from "../../hoc/withAdaptivity";
4
3
  import { IOS } from "../../lib/platform";
5
4
  import { ActionSheetDropdownDesktop } from "./ActionSheetDropdownDesktop";
6
5
  import { ActionSheetDropdown } from "./ActionSheetDropdown";
@@ -9,10 +8,11 @@ import { ActionSheetContext, ItemClickHandler } from "./ActionSheetContext";
9
8
  import { Caption } from "../Typography/Caption/Caption";
10
9
  import { usePlatform } from "../../hooks/usePlatform";
11
10
  import { useTimeout } from "../../hooks/useTimeout";
12
- import { useAdaptivity } from "../../hooks/useAdaptivity";
11
+ import { useAdaptivityIsDesktop } from "../../hooks/useAdaptivity";
13
12
  import { useObjectMemo } from "../../hooks/useObjectMemo";
14
13
  import { warnOnce } from "../../lib/warnOnce";
15
14
  import { SharedDropdownProps, PopupDirection, ToggleRef } from "./types";
15
+ import { useScrollLock } from "../AppRoot/ScrollContext";
16
16
  import "./ActionSheet.css";
17
17
 
18
18
  export interface ActionSheetProps extends React.HTMLAttributes<HTMLDivElement> {
@@ -61,13 +61,15 @@ export const ActionSheet: React.FC<ActionSheetProps> = ({
61
61
  };
62
62
 
63
63
  if (process.env.NODE_ENV === "development" && !restProps.onClose) {
64
- warn("can't close on outer click without onClose", "error");
64
+ warn(
65
+ `Без свойства "onClose" нельзя закрыть ActionSheet по клику вне компонента`,
66
+ "error"
67
+ );
65
68
  }
66
69
 
67
- const { viewWidth, viewHeight, hasMouse } = useAdaptivity();
68
- const isDesktop =
69
- viewWidth >= ViewWidth.SMALL_TABLET &&
70
- (hasMouse || viewHeight >= ViewHeight.MEDIUM);
70
+ const isDesktop = useAdaptivityIsDesktop();
71
+
72
+ useScrollLock(!isDesktop);
71
73
 
72
74
  let timeout = platform === IOS ? 300 : 200;
73
75
 
@@ -38,7 +38,7 @@ export const ActionSheetDropdownDesktop: React.FC<SharedDropdownProps> = ({
38
38
  useEffectDev(() => {
39
39
  const toggleEl = getEl(toggleRef);
40
40
  if (!toggleEl) {
41
- warn("toggleRef not passed", "error");
41
+ warn(`Свойство "toggleRef" не передано`, "error");
42
42
  }
43
43
  }, [toggleRef]);
44
44
 
@@ -1,6 +1,7 @@
1
1
  ActionSheet – имитация [нативного компонента](https://developer.apple.com/ios/human-interface-guidelines/views/action-sheets/).
2
2
  Удобно использовать, когда нужно дать пользователю выбрать одно из множества действий. В качестве `children` принимает
3
3
  коллекцию `ActionSheetItem`.
4
+ На больших экранах прокрутка не отключается.
4
5
 
5
6
  Передаётся в качестве значения свойства `popout` компонента [`SplitLayout`](#/SplitLayout).
6
7
 
@@ -19,6 +19,11 @@ import {
19
19
  AdaptivityContextInterface,
20
20
  AdaptivityProps,
21
21
  } from "../AdaptivityProvider/AdaptivityContext";
22
+ import { withContext } from "../../hoc/withContext";
23
+ import {
24
+ ScrollContext,
25
+ ScrollContextInterface,
26
+ } from "../AppRoot/ScrollContext";
22
27
  import "./Alert.css";
23
28
 
24
29
  export type AlertActionInterface = AlertAction &
@@ -40,6 +45,8 @@ export interface AlertProps
40
45
  header?: React.ReactNode;
41
46
  text?: React.ReactNode;
42
47
  onClose?: VoidFunction;
48
+ /** @ignore */
49
+ scroll?: ScrollContextInterface;
43
50
  }
44
51
 
45
52
  export type TAlertProps = AlertProps & AdaptivityContextInterface;
@@ -61,6 +68,14 @@ class AlertComponent extends React.Component<TAlertProps, AlertState> {
61
68
  };
62
69
  }
63
70
 
71
+ componentDidMount() {
72
+ this.props.scroll?.enableScrollLock();
73
+ }
74
+
75
+ componentWillUnmount() {
76
+ this.props.scroll?.disableScrollLock();
77
+ }
78
+
64
79
  element: React.RefObject<HTMLDivElement>;
65
80
 
66
81
  private transitionFinishTimeout: number | undefined = undefined;
@@ -282,8 +297,12 @@ class AlertComponent extends React.Component<TAlertProps, AlertState> {
282
297
  }
283
298
  }
284
299
 
285
- export const Alert = withPlatform(
286
- withAdaptivity(AlertComponent, {
287
- viewWidth: true,
288
- })
300
+ export const Alert = withContext(
301
+ withPlatform(
302
+ withAdaptivity(AlertComponent, {
303
+ viewWidth: true,
304
+ })
305
+ ),
306
+ ScrollContext,
307
+ "scroll"
289
308
  );
@@ -21,6 +21,7 @@ import { warnOnce } from "../../lib/warnOnce";
21
21
  import { useKeyboardInputTracker } from "../../hooks/useKeyboardInputTracker";
22
22
  import { useInsets } from "../../hooks/useInsets";
23
23
  import { Insets } from "@vkontakte/vk-bridge";
24
+ import { ConfigProviderContext } from "../ConfigProvider/ConfigProviderContext";
24
25
  import "./AppRoot.css";
25
26
 
26
27
  // Используйте classList, но будьте осторожны
@@ -60,6 +61,7 @@ export const AppRoot = withAdaptivity<AppRootProps>(
60
61
  );
61
62
  const { window, document } = useDOM();
62
63
  const insets = useInsets();
64
+ const { appearance } = React.useContext(ConfigProviderContext);
63
65
 
64
66
  const initialized = React.useRef(false);
65
67
  if (!initialized.current) {
@@ -72,10 +74,13 @@ export const AppRoot = withAdaptivity<AppRootProps>(
72
74
 
73
75
  if (process.env.NODE_ENV === "development") {
74
76
  if (scroll !== "global" && mode !== "embedded") {
75
- warn("Scroll modes only supported in embedded mode", "error");
77
+ warn(
78
+ `Свойство scroll="${scroll}" поддерживается только в режиме embedded`,
79
+ "error"
80
+ );
76
81
  }
77
82
  if (_mode && _embedded) {
78
- warn(`mode="${mode}" overrides embedded`);
83
+ warn(`Свойство mode="${mode}" приоритетнее, чем "embedded"`);
79
84
  }
80
85
  }
81
86
 
@@ -155,6 +160,16 @@ export const AppRoot = withAdaptivity<AppRootProps>(
155
160
  return () => container?.classList.remove("vkui--sizeX-regular");
156
161
  }, [sizeX]);
157
162
 
163
+ useIsomorphicLayoutEffect(() => {
164
+ if (mode !== "full" || appearance === undefined) {
165
+ return noop;
166
+ }
167
+ document!.documentElement.style.setProperty("color-scheme", appearance);
168
+
169
+ return () =>
170
+ document!.documentElement.style.removeProperty("color-scheme");
171
+ }, [appearance]);
172
+
158
173
  const scrollController = React.useMemo<ScrollContextInterface>(
159
174
  () =>
160
175
  scroll === "contain"
@@ -1,21 +1,39 @@
1
1
  import * as React from "react";
2
2
  import { noop } from "../../lib/utils";
3
+ import { useIsomorphicLayoutEffect } from "../../lib/useIsomorphicLayoutEffect";
3
4
  import { clamp } from "../../helpers/math";
4
5
 
6
+ const clearDisableScrollStyle = (node: HTMLElement) => {
7
+ Object.assign(node.style, {
8
+ position: "",
9
+ top: "",
10
+ left: "",
11
+ right: "",
12
+ overflowY: "",
13
+ overflowX: "",
14
+ });
15
+ };
16
+
5
17
  export interface ScrollContextInterface {
6
18
  getScroll(): { x: number; y: number };
7
19
  scrollTo(x?: number, y?: number): void;
20
+ enableScrollLock(): void;
21
+ disableScrollLock(): void;
8
22
  }
9
23
 
10
24
  export const ScrollContext = React.createContext<ScrollContextInterface>({
11
25
  getScroll: () => ({ x: 0, y: 0 }),
12
26
  scrollTo: noop,
27
+ enableScrollLock: noop,
28
+ disableScrollLock: noop,
13
29
  });
14
30
 
31
+ export const useScroll = () => React.useContext(ScrollContext);
32
+
15
33
  export const globalScrollController = (
16
34
  window: Window | undefined,
17
35
  document: HTMLDocument | undefined
18
- ) => ({
36
+ ): ScrollContextInterface => ({
19
37
  getScroll: () => ({ x: window!.pageXOffset, y: window!.pageYOffset }),
20
38
  scrollTo: (x = 0, y = 0) => {
21
39
  // Some iOS versions do not normalize scroll — do it manually.
@@ -24,11 +42,39 @@ export const globalScrollController = (
24
42
  y ? clamp(y, 0, document!.body.scrollHeight - window!.innerHeight) : 0
25
43
  );
26
44
  },
45
+ enableScrollLock: () => {
46
+ const scrollY = window!.pageYOffset;
47
+ const scrollX = window!.pageXOffset;
48
+ const overflowY =
49
+ window!.innerWidth > document!.documentElement.clientWidth
50
+ ? "scroll"
51
+ : "";
52
+ const overflowX =
53
+ window!.innerHeight > document!.documentElement.clientHeight
54
+ ? "scroll"
55
+ : "";
56
+
57
+ Object.assign(document!.body.style, {
58
+ position: "fixed",
59
+ top: `-${scrollY}px`,
60
+ left: `-${scrollX}px`,
61
+ right: "0",
62
+ overflowY,
63
+ overflowX,
64
+ });
65
+ },
66
+ disableScrollLock: () => {
67
+ const scrollY = document!.body.style.top;
68
+ const scrollX = document!.body.style.left;
69
+
70
+ clearDisableScrollStyle(document!.body);
71
+ window!.scrollTo(-parseInt(scrollX || "0"), -parseInt(scrollY || "0"));
72
+ },
27
73
  });
28
74
 
29
75
  export const elementScrollController = (
30
76
  elRef: React.RefObject<HTMLElement>
31
- ) => ({
77
+ ): ScrollContextInterface => ({
32
78
  getScroll: () => ({
33
79
  x: elRef.current?.scrollLeft ?? 0,
34
80
  y: elRef.current?.scrollTop ?? 0,
@@ -41,4 +87,46 @@ export const elementScrollController = (
41
87
  y ? clamp(y, 0, el.scrollHeight - el.clientHeight) : 0
42
88
  );
43
89
  },
90
+ enableScrollLock: () => {
91
+ const el = elRef.current;
92
+ if (!el) {
93
+ return;
94
+ }
95
+ const scrollY = el.scrollTop;
96
+ const scrollX = el.scrollLeft;
97
+ const overflowY = el.scrollWidth > el.clientWidth ? "scroll" : "";
98
+ const overflowX = el.scrollHeight > el.clientHeight ? "scroll" : "";
99
+
100
+ Object.assign(el.style, {
101
+ position: "absolute",
102
+ top: `-${scrollY}px`,
103
+ left: `-${scrollX}px`,
104
+ right: "0",
105
+ overflowY,
106
+ overflowX,
107
+ });
108
+ },
109
+ disableScrollLock: () => {
110
+ const el = elRef.current;
111
+ if (!el) {
112
+ return;
113
+ }
114
+
115
+ const scrollY = el.style.top;
116
+ const scrollX = el.style.left;
117
+
118
+ clearDisableScrollStyle(el);
119
+ el.scrollTo(-parseInt(scrollX || "0"), -parseInt(scrollY || "0"));
120
+ },
44
121
  });
122
+
123
+ export const useScrollLock = (enabled = true) => {
124
+ const { enableScrollLock, disableScrollLock } = useScroll();
125
+ useIsomorphicLayoutEffect(() => {
126
+ if (enabled) {
127
+ enableScrollLock();
128
+ return disableScrollLock;
129
+ }
130
+ return noop;
131
+ }, [enableScrollLock, disableScrollLock, enabled]);
132
+ };
@@ -568,11 +568,13 @@
568
568
  flex: 1;
569
569
  margin-left: 6px;
570
570
  margin-right: 6px;
571
+ width: 0;
571
572
  }
572
573
 
573
574
  .ModalCardBase__actions--v .Button {
574
575
  margin-left: 0;
575
576
  margin-right: 0;
577
+ width: 100%;
576
578
  }
577
579
 
578
580
  .ModalCardBase__actions--v .Button + .Button {
@@ -28,6 +28,10 @@ export interface CalendarProps
28
28
  | "nextMonthAriaLabel"
29
29
  | "changeMonthAriaLabel"
30
30
  | "changeYearAriaLabel"
31
+ | "onNextMonth"
32
+ | "onPrevMonth"
33
+ | "prevMonthIcon"
34
+ | "nextMonthIcon"
31
35
  >,
32
36
  HasRootRef<HTMLDivElement> {
33
37
  value?: Date;
@@ -43,6 +47,15 @@ export interface CalendarProps
43
47
  onChange?(value?: Date): void;
44
48
  shouldDisableDate?(value: Date): boolean;
45
49
  onClose?(): void;
50
+ /**
51
+ * Дата отображаемого месяца.
52
+ * При использовании обновление даты должно происходить вне компонента.
53
+ */
54
+ viewDate?: Date;
55
+ /**
56
+ * Изменение даты в шапке календаря.
57
+ */
58
+ onHeaderChange?(value: Date): void;
46
59
  }
47
60
 
48
61
  const warn = warnOnce("Calendar");
@@ -68,6 +81,12 @@ export const Calendar: React.FC<CalendarProps> = ({
68
81
  showNeighboringMonth,
69
82
  changeDayAriaLabel = "Изменить день",
70
83
  size = "m",
84
+ viewDate: externalViewDate,
85
+ onHeaderChange,
86
+ onNextMonth,
87
+ onPrevMonth,
88
+ prevMonthIcon,
89
+ nextMonthIcon,
71
90
  ...props
72
91
  }) => {
73
92
  const {
@@ -80,7 +99,15 @@ export const Calendar: React.FC<CalendarProps> = ({
80
99
  isDayFocused,
81
100
  isDayDisabled,
82
101
  resetSelectedDay,
83
- } = useCalendar({ value, disableFuture, disablePast, shouldDisableDate });
102
+ } = useCalendar({
103
+ value,
104
+ disableFuture,
105
+ disablePast,
106
+ shouldDisableDate,
107
+ onHeaderChange,
108
+ onNextMonth,
109
+ onPrevMonth,
110
+ });
84
111
 
85
112
  useIsomorphicLayoutEffect(() => {
86
113
  if (value) {
@@ -140,7 +167,7 @@ export const Calendar: React.FC<CalendarProps> = ({
140
167
  vkuiClass={classNames("Calendar", `Calendar--size-${size}`)}
141
168
  >
142
169
  <CalendarHeader
143
- viewDate={viewDate}
170
+ viewDate={externalViewDate || viewDate}
144
171
  onChange={setViewDate}
145
172
  onNextMonth={setNextMonth}
146
173
  onPrevMonth={setPrevMonth}
@@ -150,9 +177,11 @@ export const Calendar: React.FC<CalendarProps> = ({
150
177
  nextMonthAriaLabel={nextMonthAriaLabel}
151
178
  changeMonthAriaLabel={changeMonthAriaLabel}
152
179
  changeYearAriaLabel={changeYearAriaLabel}
180
+ prevMonthIcon={prevMonthIcon}
181
+ nextMonthIcon={nextMonthIcon}
153
182
  />
154
183
  <CalendarDays
155
- viewDate={viewDate}
184
+ viewDate={externalViewDate || viewDate}
156
185
  value={value}
157
186
  weekStartsOn={weekStartsOn}
158
187
  isDayFocused={isDayFocused}
@@ -21,6 +21,9 @@
21
21
  justify-content: center;
22
22
  align-items: center;
23
23
  padding: 3px;
24
+ }
25
+
26
+ .CalendarHeader__nav-icon--accent {
24
27
  color: var(--vkui--color_icon_accent);
25
28
  }
26
29
 
@@ -29,8 +29,16 @@ export interface CalendarHeaderProps
29
29
  nextMonthAriaLabel?: string;
30
30
  changeMonthAriaLabel?: string;
31
31
  changeYearAriaLabel?: string;
32
+ prevMonthIcon?: React.ReactNode;
33
+ nextMonthIcon?: React.ReactNode;
32
34
  onChange(viewDate: Date): void;
35
+ /**
36
+ * Нажатие на кнопку переключения на следующий месяц.
37
+ */
33
38
  onNextMonth?(): void;
39
+ /**
40
+ * Нажатие на кнопку переключения на предыдущий месяц.
41
+ */
34
42
  onPrevMonth?(): void;
35
43
  }
36
44
 
@@ -59,6 +67,20 @@ export const CalendarHeader: React.FC<CalendarHeaderProps> = ({
59
67
  nextMonthAriaLabel = "Следующий месяц",
60
68
  changeMonthAriaLabel = "Изменить месяц",
61
69
  changeYearAriaLabel = "Изменить год",
70
+ prevMonthIcon = (
71
+ <Icon20ChevronLeftOutline
72
+ vkuiClass="CalendarHeader__nav-icon--accent"
73
+ width={30}
74
+ height={30}
75
+ />
76
+ ),
77
+ nextMonthIcon = (
78
+ <Icon20ChevronRightOutline
79
+ vkuiClass="CalendarHeader__nav-icon--accent"
80
+ width={30}
81
+ height={30}
82
+ />
83
+ ),
62
84
  }) => {
63
85
  const locale = React.useContext(LocaleProviderContext);
64
86
  const onMonthsChange = React.useCallback(
@@ -96,7 +118,7 @@ export const CalendarHeader: React.FC<CalendarHeaderProps> = ({
96
118
  subMonths(viewDate, 1)
97
119
  )}`}
98
120
  >
99
- <Icon20ChevronLeftOutline width={30} height={30} />
121
+ {prevMonthIcon}
100
122
  </Tappable>
101
123
  )}
102
124
  <div vkuiClass="CalendarHeader__pickers">
@@ -160,7 +182,7 @@ export const CalendarHeader: React.FC<CalendarHeaderProps> = ({
160
182
  addMonths(viewDate, 1)
161
183
  )}`}
162
184
  >
163
- <Icon20ChevronRightOutline width={30} height={30} />
185
+ {nextMonthIcon}
164
186
  </Tappable>
165
187
  )}
166
188
  </div>