@vkontakte/vkui 8.1.2 → 8.2.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 (653) hide show
  1. package/dist/components/ActionSheet/ActionSheet.d.ts +5 -4
  2. package/dist/components/ActionSheet/ActionSheet.d.ts.map +1 -1
  3. package/dist/components/ActionSheet/ActionSheet.js +2 -1
  4. package/dist/components/ActionSheet/ActionSheet.js.map +1 -1
  5. package/dist/components/AdaptivityProvider/AdaptivityContext.d.ts +3 -3
  6. package/dist/components/AdaptivityProvider/AdaptivityContext.js.map +1 -1
  7. package/dist/components/AdaptivityProvider/AdaptivityProvider.js +2 -2
  8. package/dist/components/AdaptivityProvider/AdaptivityProvider.js.map +1 -1
  9. package/dist/components/AppRoot/AppRoot.d.ts.map +1 -1
  10. package/dist/components/AppRoot/AppRoot.js +0 -6
  11. package/dist/components/AppRoot/AppRoot.js.map +1 -1
  12. package/dist/components/AppRoot/AppRootContext.d.ts +0 -1
  13. package/dist/components/AppRoot/AppRootContext.d.ts.map +1 -1
  14. package/dist/components/AppRoot/AppRootContext.js +0 -1
  15. package/dist/components/AppRoot/AppRootContext.js.map +1 -1
  16. package/dist/components/Calendar/Calendar.d.ts +1 -1
  17. package/dist/components/Calendar/Calendar.js +2 -1
  18. package/dist/components/Calendar/Calendar.js.map +1 -1
  19. package/dist/components/CalendarDay/CalendarDay.d.ts.map +1 -1
  20. package/dist/components/CalendarDay/CalendarDay.js +4 -2
  21. package/dist/components/CalendarDay/CalendarDay.js.map +1 -1
  22. package/dist/components/CalendarDays/CalendarDays.d.ts.map +1 -1
  23. package/dist/components/CalendarDays/CalendarDays.js +2 -2
  24. package/dist/components/CalendarDays/CalendarDays.js.map +1 -1
  25. package/dist/components/CalendarHeader/CalendarHeader.d.ts.map +1 -1
  26. package/dist/components/CalendarHeader/CalendarHeader.js +4 -2
  27. package/dist/components/CalendarHeader/CalendarHeader.js.map +1 -1
  28. package/dist/components/CalendarRange/CalendarRange.d.ts +2 -2
  29. package/dist/components/CalendarRange/CalendarRange.js.map +1 -1
  30. package/dist/components/CalendarTime/CalendarTime.d.ts +1 -1
  31. package/dist/components/CalendarTime/CalendarTime.d.ts.map +1 -1
  32. package/dist/components/CalendarTime/CalendarTime.js +61 -50
  33. package/dist/components/CalendarTime/CalendarTime.js.map +1 -1
  34. package/dist/components/CalendarTime/CalendarTimePicker.d.ts +11 -7
  35. package/dist/components/CalendarTime/CalendarTimePicker.d.ts.map +1 -1
  36. package/dist/components/CalendarTime/CalendarTimePicker.js +108 -48
  37. package/dist/components/CalendarTime/CalendarTimePicker.js.map +1 -1
  38. package/dist/components/CalendarTime/ComboBox.d.ts +25 -0
  39. package/dist/components/CalendarTime/ComboBox.d.ts.map +1 -0
  40. package/dist/components/CalendarTime/ComboBox.js +112 -0
  41. package/dist/components/CalendarTime/ComboBox.js.map +1 -0
  42. package/dist/components/CardScroll/CardScroll.d.ts.map +1 -1
  43. package/dist/components/CardScroll/CardScroll.js +2 -2
  44. package/dist/components/CardScroll/CardScroll.js.map +1 -1
  45. package/dist/components/CarouselBase/CarouselBase.d.ts.map +1 -1
  46. package/dist/components/CarouselBase/CarouselBase.js +3 -1
  47. package/dist/components/CarouselBase/CarouselBase.js.map +1 -1
  48. package/dist/components/ChipsSelect/useChipsSelect.d.ts.map +1 -1
  49. package/dist/components/ChipsSelect/useChipsSelect.js +2 -1
  50. package/dist/components/ChipsSelect/useChipsSelect.js.map +1 -1
  51. package/dist/components/ConfigProvider/ConfigProvider.d.ts.map +1 -1
  52. package/dist/components/ConfigProvider/ConfigProvider.js +8 -4
  53. package/dist/components/ConfigProvider/ConfigProvider.js.map +1 -1
  54. package/dist/components/ConfigProvider/ConfigProviderOverride.d.ts.map +1 -1
  55. package/dist/components/ConfigProvider/ConfigProviderOverride.js +5 -1
  56. package/dist/components/ConfigProvider/ConfigProviderOverride.js.map +1 -1
  57. package/dist/components/ConfigProvider/ConfigProviderSubContexts.d.ts +15 -0
  58. package/dist/components/ConfigProvider/ConfigProviderSubContexts.d.ts.map +1 -0
  59. package/dist/components/ConfigProvider/ConfigProviderSubContexts.js +25 -0
  60. package/dist/components/ConfigProvider/ConfigProviderSubContexts.js.map +1 -0
  61. package/dist/components/ContentBadge/ContentBadge.d.ts +14 -1
  62. package/dist/components/ContentBadge/ContentBadge.d.ts.map +1 -1
  63. package/dist/components/ContentBadge/ContentBadge.js +39 -1
  64. package/dist/components/ContentBadge/ContentBadge.js.map +1 -1
  65. package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  66. package/dist/components/CustomSelect/CustomSelect.js +16 -10
  67. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  68. package/dist/components/DateInput/DateInput.d.ts.map +1 -1
  69. package/dist/components/DateInput/DateInput.js +4 -3
  70. package/dist/components/DateInput/DateInput.js.map +1 -1
  71. package/dist/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  72. package/dist/components/DateRangeInput/DateRangeInput.js +2 -2
  73. package/dist/components/DateRangeInput/DateRangeInput.js.map +1 -1
  74. package/dist/components/Epic/ScrollSaver.d.ts.map +1 -1
  75. package/dist/components/Epic/ScrollSaver.js +1 -0
  76. package/dist/components/Epic/ScrollSaver.js.map +1 -1
  77. package/dist/components/FixedLayout/ParentWidthWrapper.d.ts +6 -0
  78. package/dist/components/FixedLayout/ParentWidthWrapper.d.ts.map +1 -0
  79. package/dist/components/FixedLayout/ParentWidthWrapper.js +43 -0
  80. package/dist/components/FixedLayout/ParentWidthWrapper.js.map +1 -0
  81. package/dist/components/Flex/Flex.d.ts +7 -4
  82. package/dist/components/Flex/Flex.d.ts.map +1 -1
  83. package/dist/components/Flex/Flex.js +5 -2
  84. package/dist/components/Flex/Flex.js.map +1 -1
  85. package/dist/components/ImageBase/ImageBaseFloatElement/ImageBaseFloatElement.js +3 -1
  86. package/dist/components/ImageBase/ImageBaseFloatElement/ImageBaseFloatElement.js.map +1 -1
  87. package/dist/components/NativeSelect/NativeSelect.d.ts.map +1 -1
  88. package/dist/components/NativeSelect/NativeSelect.js +6 -2
  89. package/dist/components/NativeSelect/NativeSelect.js.map +1 -1
  90. package/dist/components/NavTransitionContext/NavTransitionContext.d.ts +2 -1
  91. package/dist/components/NavTransitionContext/NavTransitionContext.d.ts.map +1 -1
  92. package/dist/components/NavTransitionContext/NavTransitionContext.js +8 -4
  93. package/dist/components/NavTransitionContext/NavTransitionContext.js.map +1 -1
  94. package/dist/components/OnboardingTooltip/OnboardingTooltip.d.ts.map +1 -1
  95. package/dist/components/OnboardingTooltip/OnboardingTooltip.js +4 -5
  96. package/dist/components/OnboardingTooltip/OnboardingTooltip.js.map +1 -1
  97. package/dist/components/PanelHeader/PanelHeader.d.ts +1 -1
  98. package/dist/components/PanelHeader/PanelHeader.js.map +1 -1
  99. package/dist/components/Popper/Popper.d.ts.map +1 -1
  100. package/dist/components/Popper/Popper.js +7 -4
  101. package/dist/components/Popper/Popper.js.map +1 -1
  102. package/dist/components/PullToRefresh/PullToRefresh.d.ts.map +1 -1
  103. package/dist/components/PullToRefresh/PullToRefresh.js +8 -4
  104. package/dist/components/PullToRefresh/PullToRefresh.js.map +1 -1
  105. package/dist/components/Root/Root.d.ts +1 -1
  106. package/dist/components/Root/Root.d.ts.map +1 -1
  107. package/dist/components/Root/Root.js +43 -37
  108. package/dist/components/Root/Root.js.map +1 -1
  109. package/dist/components/SimpleGrid/SimpleGrid.d.ts +9 -8
  110. package/dist/components/SimpleGrid/SimpleGrid.d.ts.map +1 -1
  111. package/dist/components/SimpleGrid/SimpleGrid.js +9 -2
  112. package/dist/components/SimpleGrid/SimpleGrid.js.map +1 -1
  113. package/dist/components/Skeleton/Skeleton.d.ts.map +1 -1
  114. package/dist/components/Skeleton/Skeleton.js +3 -4
  115. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  116. package/dist/components/Snackbar/Snackbar.d.ts.map +1 -1
  117. package/dist/components/Snackbar/Snackbar.js +6 -3
  118. package/dist/components/Snackbar/Snackbar.js.map +1 -1
  119. package/dist/components/Spacing/Spacing.d.ts +1 -1
  120. package/dist/components/Spacing/Spacing.js.map +1 -1
  121. package/dist/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.d.ts +10 -0
  122. package/dist/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.d.ts.map +1 -0
  123. package/dist/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.js +54 -0
  124. package/dist/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.js.map +1 -0
  125. package/dist/components/Spinner/ExpressiveSpinner/icons.d.ts +18 -0
  126. package/dist/components/Spinner/ExpressiveSpinner/icons.d.ts.map +1 -0
  127. package/dist/components/Spinner/ExpressiveSpinner/icons.js +79 -0
  128. package/dist/components/Spinner/ExpressiveSpinner/icons.js.map +1 -0
  129. package/dist/components/Spinner/SvgIcon.d.ts +14 -0
  130. package/dist/components/Spinner/SvgIcon.d.ts.map +1 -0
  131. package/dist/components/Spinner/SvgIcon.js +20 -0
  132. package/dist/components/Spinner/SvgIcon.js.map +1 -0
  133. package/dist/components/Spinner/icons.d.ts +1 -1
  134. package/dist/components/Spinner/icons.d.ts.map +1 -1
  135. package/dist/components/Spinner/icons.js +10 -23
  136. package/dist/components/Spinner/icons.js.map +1 -1
  137. package/dist/components/SplitLayout/SplitLayout.d.ts +3 -3
  138. package/dist/components/SplitLayout/SplitLayout.js.map +1 -1
  139. package/dist/components/TabsItem/TabsItem.d.ts.map +1 -1
  140. package/dist/components/TabsItem/TabsItem.js +2 -5
  141. package/dist/components/TabsItem/TabsItem.js.map +1 -1
  142. package/dist/components/Tappable/Tappable.d.ts +2 -2
  143. package/dist/components/Tappable/Tappable.js.map +1 -1
  144. package/dist/components/View/View.d.ts.map +1 -1
  145. package/dist/components/View/View.js +50 -53
  146. package/dist/components/View/View.js.map +1 -1
  147. package/dist/components/View/ViewInfinite.d.ts.map +1 -1
  148. package/dist/components/View/ViewInfinite.js +34 -37
  149. package/dist/components/View/ViewInfinite.js.map +1 -1
  150. package/dist/components/WriteBar/WriteBar.d.ts +15 -1
  151. package/dist/components/WriteBar/WriteBar.d.ts.map +1 -1
  152. package/dist/components/WriteBar/WriteBar.js +35 -63
  153. package/dist/components/WriteBar/WriteBar.js.map +1 -1
  154. package/dist/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.d.ts +5 -0
  155. package/dist/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.d.ts.map +1 -0
  156. package/dist/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.js +15 -0
  157. package/dist/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.js.map +1 -0
  158. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormField.d.ts +8 -0
  159. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormField.d.ts.map +1 -0
  160. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormField.js +16 -0
  161. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormField.js.map +1 -0
  162. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.d.ts +5 -0
  163. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.d.ts.map +1 -0
  164. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.js +15 -0
  165. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.js.map +1 -0
  166. package/dist/components/WriteBar/WriteBarRoot/WriteBarRoot.d.ts +10 -0
  167. package/dist/components/WriteBar/WriteBarRoot/WriteBarRoot.d.ts.map +1 -0
  168. package/dist/components/WriteBar/WriteBarRoot/WriteBarRoot.js +16 -0
  169. package/dist/components/WriteBar/WriteBarRoot/WriteBarRoot.js.map +1 -0
  170. package/dist/components/WriteBar/WriteBarTextarea/WriteBarTextarea.d.ts +10 -0
  171. package/dist/components/WriteBar/WriteBarTextarea/WriteBarTextarea.d.ts.map +1 -0
  172. package/dist/components/WriteBar/WriteBarTextarea/WriteBarTextarea.js +39 -0
  173. package/dist/components/WriteBar/WriteBarTextarea/WriteBarTextarea.js.map +1 -0
  174. package/dist/components.css +1 -1
  175. package/dist/components.css.map +1 -1
  176. package/dist/cssm/components/ActionSheet/ActionSheet.js +2 -1
  177. package/dist/cssm/components/ActionSheet/ActionSheet.js.map +1 -1
  178. package/dist/cssm/components/AdaptivityProvider/AdaptivityContext.js.map +1 -1
  179. package/dist/cssm/components/AdaptivityProvider/AdaptivityProvider.js +2 -2
  180. package/dist/cssm/components/AdaptivityProvider/AdaptivityProvider.js.map +1 -1
  181. package/dist/cssm/components/AppRoot/AppRoot.js +0 -6
  182. package/dist/cssm/components/AppRoot/AppRoot.js.map +1 -1
  183. package/dist/cssm/components/AppRoot/AppRootContext.js +0 -1
  184. package/dist/cssm/components/AppRoot/AppRootContext.js.map +1 -1
  185. package/dist/cssm/components/Calendar/Calendar.js +2 -1
  186. package/dist/cssm/components/Calendar/Calendar.js.map +1 -1
  187. package/dist/cssm/components/CalendarDay/CalendarDay.js +4 -2
  188. package/dist/cssm/components/CalendarDay/CalendarDay.js.map +1 -1
  189. package/dist/cssm/components/CalendarDays/CalendarDays.js +2 -2
  190. package/dist/cssm/components/CalendarDays/CalendarDays.js.map +1 -1
  191. package/dist/cssm/components/CalendarHeader/CalendarHeader.js +4 -2
  192. package/dist/cssm/components/CalendarHeader/CalendarHeader.js.map +1 -1
  193. package/dist/cssm/components/CalendarRange/CalendarRange.js.map +1 -1
  194. package/dist/cssm/components/CalendarTime/CalendarTime.js +61 -50
  195. package/dist/cssm/components/CalendarTime/CalendarTime.js.map +1 -1
  196. package/dist/cssm/components/CalendarTime/CalendarTime.module.css +38 -0
  197. package/dist/cssm/components/CalendarTime/CalendarTimePicker.js +108 -48
  198. package/dist/cssm/components/CalendarTime/CalendarTimePicker.js.map +1 -1
  199. package/dist/cssm/components/CalendarTime/ComboBox.js +113 -0
  200. package/dist/cssm/components/CalendarTime/ComboBox.js.map +1 -0
  201. package/dist/cssm/components/CardScroll/CardScroll.js +2 -2
  202. package/dist/cssm/components/CardScroll/CardScroll.js.map +1 -1
  203. package/dist/cssm/components/CarouselBase/CarouselBase.js +3 -1
  204. package/dist/cssm/components/CarouselBase/CarouselBase.js.map +1 -1
  205. package/dist/cssm/components/ChipsSelect/useChipsSelect.js +2 -1
  206. package/dist/cssm/components/ChipsSelect/useChipsSelect.js.map +1 -1
  207. package/dist/cssm/components/ConfigProvider/ConfigProvider.js +8 -4
  208. package/dist/cssm/components/ConfigProvider/ConfigProvider.js.map +1 -1
  209. package/dist/cssm/components/ConfigProvider/ConfigProviderOverride.js +5 -1
  210. package/dist/cssm/components/ConfigProvider/ConfigProviderOverride.js.map +1 -1
  211. package/dist/cssm/components/ConfigProvider/ConfigProviderSubContexts.js +25 -0
  212. package/dist/cssm/components/ConfigProvider/ConfigProviderSubContexts.js.map +1 -0
  213. package/dist/cssm/components/ContentBadge/ContentBadge.js +39 -1
  214. package/dist/cssm/components/ContentBadge/ContentBadge.js.map +1 -1
  215. package/dist/cssm/components/ContentBadge/ContentBadge.module.css +88 -90
  216. package/dist/cssm/components/CustomSelect/CustomSelect.js +16 -10
  217. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  218. package/dist/cssm/components/DateInput/DateInput.js +4 -3
  219. package/dist/cssm/components/DateInput/DateInput.js.map +1 -1
  220. package/dist/cssm/components/DateRangeInput/DateRangeInput.js +2 -2
  221. package/dist/cssm/components/DateRangeInput/DateRangeInput.js.map +1 -1
  222. package/dist/cssm/components/Epic/ScrollSaver.js +1 -0
  223. package/dist/cssm/components/Epic/ScrollSaver.js.map +1 -1
  224. package/dist/cssm/components/FixedLayout/ParentWidthWrapper.js +43 -0
  225. package/dist/cssm/components/FixedLayout/ParentWidthWrapper.js.map +1 -0
  226. package/dist/cssm/components/Flex/Flex.js +5 -2
  227. package/dist/cssm/components/Flex/Flex.js.map +1 -1
  228. package/dist/cssm/components/GridAvatar/GridAvatar.module.css +1 -1
  229. package/dist/cssm/components/ImageBase/ImageBaseFloatElement/ImageBaseFloatElement.js +3 -1
  230. package/dist/cssm/components/ImageBase/ImageBaseFloatElement/ImageBaseFloatElement.js.map +1 -1
  231. package/dist/cssm/components/NativeSelect/NativeSelect.js +6 -2
  232. package/dist/cssm/components/NativeSelect/NativeSelect.js.map +1 -1
  233. package/dist/cssm/components/NavTransitionContext/NavTransitionContext.js +8 -4
  234. package/dist/cssm/components/NavTransitionContext/NavTransitionContext.js.map +1 -1
  235. package/dist/cssm/components/OnboardingTooltip/OnboardingTooltip.js +4 -5
  236. package/dist/cssm/components/OnboardingTooltip/OnboardingTooltip.js.map +1 -1
  237. package/dist/cssm/components/PanelHeader/PanelHeader.js.map +1 -1
  238. package/dist/cssm/components/Popper/Popper.js +7 -4
  239. package/dist/cssm/components/Popper/Popper.js.map +1 -1
  240. package/dist/cssm/components/PullToRefresh/PullToRefresh.js +8 -4
  241. package/dist/cssm/components/PullToRefresh/PullToRefresh.js.map +1 -1
  242. package/dist/cssm/components/PullToRefresh/PullToRefresh.module.css +1 -1
  243. package/dist/cssm/components/Root/Root.js +43 -37
  244. package/dist/cssm/components/Root/Root.js.map +1 -1
  245. package/dist/cssm/components/SimpleGrid/SimpleGrid.js +9 -2
  246. package/dist/cssm/components/SimpleGrid/SimpleGrid.js.map +1 -1
  247. package/dist/cssm/components/Skeleton/Skeleton.js +3 -4
  248. package/dist/cssm/components/Skeleton/Skeleton.js.map +1 -1
  249. package/dist/cssm/components/Snackbar/Snackbar.js +6 -3
  250. package/dist/cssm/components/Snackbar/Snackbar.js.map +1 -1
  251. package/dist/cssm/components/Spacing/Spacing.js.map +1 -1
  252. package/dist/cssm/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.js +56 -0
  253. package/dist/cssm/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.js.map +1 -0
  254. package/dist/cssm/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.module.css +13 -0
  255. package/dist/cssm/components/Spinner/ExpressiveSpinner/icons.js +79 -0
  256. package/dist/cssm/components/Spinner/ExpressiveSpinner/icons.js.map +1 -0
  257. package/dist/cssm/components/Spinner/SvgIcon.js +20 -0
  258. package/dist/cssm/components/Spinner/SvgIcon.js.map +1 -0
  259. package/dist/cssm/components/Spinner/icons.js +10 -23
  260. package/dist/cssm/components/Spinner/icons.js.map +1 -1
  261. package/dist/cssm/components/SplitLayout/SplitLayout.js.map +1 -1
  262. package/dist/cssm/components/TabsItem/TabsItem.js +2 -5
  263. package/dist/cssm/components/TabsItem/TabsItem.js.map +1 -1
  264. package/dist/cssm/components/Tappable/Tappable.js.map +1 -1
  265. package/dist/cssm/components/View/View.js +50 -53
  266. package/dist/cssm/components/View/View.js.map +1 -1
  267. package/dist/cssm/components/View/ViewInfinite.js +34 -37
  268. package/dist/cssm/components/View/ViewInfinite.js.map +1 -1
  269. package/dist/cssm/components/WriteBar/WriteBar.js +35 -64
  270. package/dist/cssm/components/WriteBar/WriteBar.js.map +1 -1
  271. package/dist/cssm/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.js +16 -0
  272. package/dist/cssm/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.js.map +1 -0
  273. package/dist/cssm/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.module.css +12 -0
  274. package/dist/cssm/components/WriteBar/WriteBarFormField/WriteBarFormField.js +17 -0
  275. package/dist/cssm/components/WriteBar/WriteBarFormField/WriteBarFormField.js.map +1 -0
  276. package/dist/cssm/components/WriteBar/WriteBarFormField/WriteBarFormField.module.css +18 -0
  277. package/dist/cssm/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.js +16 -0
  278. package/dist/cssm/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.js.map +1 -0
  279. package/dist/cssm/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.module.css +3 -0
  280. package/dist/cssm/components/WriteBar/WriteBarRoot/WriteBarRoot.js +17 -0
  281. package/dist/cssm/components/WriteBar/WriteBarRoot/WriteBarRoot.js.map +1 -0
  282. package/dist/cssm/components/WriteBar/WriteBarRoot/WriteBarRoot.module.css +15 -0
  283. package/dist/cssm/components/WriteBar/WriteBarTextarea/WriteBarTextarea.js +40 -0
  284. package/dist/cssm/components/WriteBar/WriteBarTextarea/WriteBarTextarea.js.map +1 -0
  285. package/dist/cssm/components/WriteBar/WriteBarTextarea/WriteBarTextarea.module.css +43 -0
  286. package/dist/cssm/helpers/math.js +6 -0
  287. package/dist/cssm/helpers/math.js.map +1 -1
  288. package/dist/cssm/hoc/withPlatform.js +3 -2
  289. package/dist/cssm/hoc/withPlatform.js.map +1 -1
  290. package/dist/cssm/hooks/useAdaptivityConditionalRender/types.js.map +1 -1
  291. package/dist/cssm/hooks/useAnimationFrame.js +40 -0
  292. package/dist/cssm/hooks/useAnimationFrame.js.map +1 -0
  293. package/dist/cssm/hooks/useAutoFocus.js +4 -1
  294. package/dist/cssm/hooks/useAutoFocus.js.map +1 -1
  295. package/dist/cssm/hooks/useColorScheme.js +3 -3
  296. package/dist/cssm/hooks/useColorScheme.js.map +1 -1
  297. package/dist/cssm/hooks/useConfigDirection.js +3 -3
  298. package/dist/cssm/hooks/useConfigDirection.js.map +1 -1
  299. package/dist/cssm/hooks/useDateInput.js +1 -2
  300. package/dist/cssm/hooks/useDateInput.js.map +1 -1
  301. package/dist/cssm/hooks/useFocusTrap/useAutoFocus.js +1 -0
  302. package/dist/cssm/hooks/useFocusTrap/useAutoFocus.js.map +1 -1
  303. package/dist/cssm/hooks/useFocusTrap/useFocusTrap.js +2 -0
  304. package/dist/cssm/hooks/useFocusTrap/useFocusTrap.js.map +1 -1
  305. package/dist/cssm/hooks/useFocusVisible.js +8 -13
  306. package/dist/cssm/hooks/useFocusVisible.js.map +1 -1
  307. package/dist/cssm/hooks/useFocusWithin.js +5 -4
  308. package/dist/cssm/hooks/useFocusWithin.js.map +1 -1
  309. package/dist/cssm/hooks/useGlobalEscKeyDown.js +17 -15
  310. package/dist/cssm/hooks/useGlobalEscKeyDown.js.map +1 -1
  311. package/dist/cssm/hooks/useGlobalOnClickOutside.js +6 -2
  312. package/dist/cssm/hooks/useGlobalOnClickOutside.js.map +1 -1
  313. package/dist/cssm/hooks/useKeyboardInputTracker.js +48 -41
  314. package/dist/cssm/hooks/useKeyboardInputTracker.js.map +1 -1
  315. package/dist/cssm/hooks/useLatestRef.js +13 -0
  316. package/dist/cssm/hooks/useLatestRef.js.map +1 -0
  317. package/dist/cssm/hooks/useLocale.js +3 -3
  318. package/dist/cssm/hooks/useLocale.js.map +1 -1
  319. package/dist/cssm/hooks/useMediaQueryMatch.js +1 -0
  320. package/dist/cssm/hooks/useMediaQueryMatch.js.map +1 -1
  321. package/dist/cssm/hooks/useMutationObserver.js +3 -3
  322. package/dist/cssm/hooks/useMutationObserver.js.map +1 -1
  323. package/dist/cssm/hooks/usePlatform.js +3 -3
  324. package/dist/cssm/hooks/usePlatform.js.map +1 -1
  325. package/dist/cssm/hooks/useResizeObserver.js +4 -6
  326. package/dist/cssm/hooks/useResizeObserver.js.map +1 -1
  327. package/dist/cssm/hooks/useSyncHTMLWithBaseVKUIClasses.js +2 -1
  328. package/dist/cssm/hooks/useSyncHTMLWithBaseVKUIClasses.js.map +1 -1
  329. package/dist/cssm/hooks/useSyncHTMLWithTokens.js +3 -1
  330. package/dist/cssm/hooks/useSyncHTMLWithTokens.js.map +1 -1
  331. package/dist/cssm/hooks/useWaitTransitionFinish.js +13 -15
  332. package/dist/cssm/hooks/useWaitTransitionFinish.js.map +1 -1
  333. package/dist/cssm/index.js +1 -0
  334. package/dist/cssm/index.js.map +1 -1
  335. package/dist/cssm/lib/array.js +18 -0
  336. package/dist/cssm/lib/array.js.map +1 -0
  337. package/dist/cssm/lib/curve.js +21 -0
  338. package/dist/cssm/lib/curve.js.map +1 -0
  339. package/dist/cssm/lib/dom.js +5 -2
  340. package/dist/cssm/lib/dom.js.map +1 -1
  341. package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +4 -4
  342. package/dist/cssm/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
  343. package/dist/cssm/lib/fx.js +4 -55
  344. package/dist/cssm/lib/fx.js.map +1 -1
  345. package/dist/cssm/lib/layouts/index.js.map +1 -1
  346. package/dist/cssm/lib/layouts/layoutProps.js +11 -0
  347. package/dist/cssm/lib/layouts/layoutProps.js.map +1 -1
  348. package/dist/cssm/lib/layouts/resolveLayoutProps.js +13 -11
  349. package/dist/cssm/lib/layouts/resolveLayoutProps.js.map +1 -1
  350. package/dist/cssm/lib/layouts/types.js.map +1 -1
  351. package/dist/cssm/lib/material/shapes/Shape.js +18 -0
  352. package/dist/cssm/lib/material/shapes/Shape.js.map +1 -0
  353. package/dist/cssm/lib/material/shapes/shapes.js +2250 -0
  354. package/dist/cssm/lib/material/shapes/shapes.js.map +1 -0
  355. package/dist/cssm/lib/math.js +31 -0
  356. package/dist/cssm/lib/math.js.map +1 -0
  357. package/dist/cssm/lib/svg/path/approximate.js +57 -0
  358. package/dist/cssm/lib/svg/path/approximate.js.map +1 -0
  359. package/dist/cssm/lib/svg/path/interpolate.js +121 -0
  360. package/dist/cssm/lib/svg/path/interpolate.js.map +1 -0
  361. package/dist/cssm/lib/svg/path/path.js +50 -0
  362. package/dist/cssm/lib/svg/path/path.js.map +1 -0
  363. package/dist/cssm/lib/svg/path/point.js +3 -0
  364. package/dist/cssm/lib/svg/path/point.js.map +1 -0
  365. package/dist/cssm/lib/svg/path/transform.js +110 -0
  366. package/dist/cssm/lib/svg/path/transform.js.map +1 -0
  367. package/dist/cssm/lib/tokens/useTokenClassName.js +4 -1
  368. package/dist/cssm/lib/tokens/useTokenClassName.js.map +1 -1
  369. package/dist/cssm/lib/touch/UIPanGestureRecognizer.js +2 -2
  370. package/dist/cssm/lib/touch/UIPanGestureRecognizer.js.map +1 -1
  371. package/dist/cssm/styles/layout.css +273 -0
  372. package/dist/cssm/types.js +1 -4
  373. package/dist/cssm/types.js.map +1 -1
  374. package/dist/helpers/math.d.ts +4 -0
  375. package/dist/helpers/math.d.ts.map +1 -1
  376. package/dist/helpers/math.js +6 -0
  377. package/dist/helpers/math.js.map +1 -1
  378. package/dist/hoc/withPlatform.d.ts +1 -1
  379. package/dist/hoc/withPlatform.d.ts.map +1 -1
  380. package/dist/hoc/withPlatform.js +3 -2
  381. package/dist/hoc/withPlatform.js.map +1 -1
  382. package/dist/hooks/useAdaptivityConditionalRender/types.d.ts +2 -2
  383. package/dist/hooks/useAdaptivityConditionalRender/types.js.map +1 -1
  384. package/dist/hooks/useAnimationFrame.d.ts +16 -0
  385. package/dist/hooks/useAnimationFrame.d.ts.map +1 -0
  386. package/dist/hooks/useAnimationFrame.js +40 -0
  387. package/dist/hooks/useAnimationFrame.js.map +1 -0
  388. package/dist/hooks/useAutoFocus.js +4 -1
  389. package/dist/hooks/useAutoFocus.js.map +1 -1
  390. package/dist/hooks/useColorScheme.d.ts.map +1 -1
  391. package/dist/hooks/useColorScheme.js +3 -3
  392. package/dist/hooks/useColorScheme.js.map +1 -1
  393. package/dist/hooks/useConfigDirection.d.ts.map +1 -1
  394. package/dist/hooks/useConfigDirection.js +3 -3
  395. package/dist/hooks/useConfigDirection.js.map +1 -1
  396. package/dist/hooks/useDateInput.d.ts.map +1 -1
  397. package/dist/hooks/useDateInput.js +1 -2
  398. package/dist/hooks/useDateInput.js.map +1 -1
  399. package/dist/hooks/useFocusTrap/useAutoFocus.js +1 -0
  400. package/dist/hooks/useFocusTrap/useAutoFocus.js.map +1 -1
  401. package/dist/hooks/useFocusTrap/useFocusTrap.d.ts.map +1 -1
  402. package/dist/hooks/useFocusTrap/useFocusTrap.js +2 -0
  403. package/dist/hooks/useFocusTrap/useFocusTrap.js.map +1 -1
  404. package/dist/hooks/useFocusVisible.d.ts.map +1 -1
  405. package/dist/hooks/useFocusVisible.js +8 -13
  406. package/dist/hooks/useFocusVisible.js.map +1 -1
  407. package/dist/hooks/useFocusWithin.d.ts.map +1 -1
  408. package/dist/hooks/useFocusWithin.js +5 -4
  409. package/dist/hooks/useFocusWithin.js.map +1 -1
  410. package/dist/hooks/useGlobalEscKeyDown.d.ts.map +1 -1
  411. package/dist/hooks/useGlobalEscKeyDown.js +17 -15
  412. package/dist/hooks/useGlobalEscKeyDown.js.map +1 -1
  413. package/dist/hooks/useGlobalOnClickOutside.d.ts.map +1 -1
  414. package/dist/hooks/useGlobalOnClickOutside.js +6 -2
  415. package/dist/hooks/useGlobalOnClickOutside.js.map +1 -1
  416. package/dist/hooks/useKeyboardInputTracker.d.ts +1 -19
  417. package/dist/hooks/useKeyboardInputTracker.d.ts.map +1 -1
  418. package/dist/hooks/useKeyboardInputTracker.js +48 -41
  419. package/dist/hooks/useKeyboardInputTracker.js.map +1 -1
  420. package/dist/hooks/useLatestRef.d.ts +3 -0
  421. package/dist/hooks/useLatestRef.d.ts.map +1 -0
  422. package/dist/hooks/useLatestRef.js +13 -0
  423. package/dist/hooks/useLatestRef.js.map +1 -0
  424. package/dist/hooks/useLocale.d.ts.map +1 -1
  425. package/dist/hooks/useLocale.js +3 -3
  426. package/dist/hooks/useLocale.js.map +1 -1
  427. package/dist/hooks/useMediaQueryMatch.js +1 -0
  428. package/dist/hooks/useMediaQueryMatch.js.map +1 -1
  429. package/dist/hooks/useMutationObserver.d.ts +1 -2
  430. package/dist/hooks/useMutationObserver.d.ts.map +1 -1
  431. package/dist/hooks/useMutationObserver.js +3 -3
  432. package/dist/hooks/useMutationObserver.js.map +1 -1
  433. package/dist/hooks/usePlatform.d.ts.map +1 -1
  434. package/dist/hooks/usePlatform.js +3 -3
  435. package/dist/hooks/usePlatform.js.map +1 -1
  436. package/dist/hooks/useResizeObserver.d.ts.map +1 -1
  437. package/dist/hooks/useResizeObserver.js +4 -6
  438. package/dist/hooks/useResizeObserver.js.map +1 -1
  439. package/dist/hooks/useSyncHTMLWithBaseVKUIClasses.js +2 -1
  440. package/dist/hooks/useSyncHTMLWithBaseVKUIClasses.js.map +1 -1
  441. package/dist/hooks/useSyncHTMLWithTokens.js +3 -1
  442. package/dist/hooks/useSyncHTMLWithTokens.js.map +1 -1
  443. package/dist/hooks/useWaitTransitionFinish.d.ts.map +1 -1
  444. package/dist/hooks/useWaitTransitionFinish.js +13 -15
  445. package/dist/hooks/useWaitTransitionFinish.js.map +1 -1
  446. package/dist/index.d.ts +1 -0
  447. package/dist/index.d.ts.map +1 -1
  448. package/dist/index.js +1 -0
  449. package/dist/index.js.map +1 -1
  450. package/dist/lib/array.d.ts +17 -0
  451. package/dist/lib/array.d.ts.map +1 -0
  452. package/dist/lib/array.js +18 -0
  453. package/dist/lib/array.js.map +1 -0
  454. package/dist/lib/curve.d.ts +9 -0
  455. package/dist/lib/curve.d.ts.map +1 -0
  456. package/dist/lib/curve.js +21 -0
  457. package/dist/lib/curve.js.map +1 -0
  458. package/dist/lib/dom.d.ts +2 -1
  459. package/dist/lib/dom.d.ts.map +1 -1
  460. package/dist/lib/dom.js +5 -2
  461. package/dist/lib/dom.js.map +1 -1
  462. package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.d.ts.map +1 -1
  463. package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js +4 -4
  464. package/dist/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.js.map +1 -1
  465. package/dist/lib/fx.d.ts +1 -8
  466. package/dist/lib/fx.d.ts.map +1 -1
  467. package/dist/lib/fx.js +4 -55
  468. package/dist/lib/fx.js.map +1 -1
  469. package/dist/lib/layouts/index.d.ts +1 -1
  470. package/dist/lib/layouts/index.d.ts.map +1 -1
  471. package/dist/lib/layouts/index.js.map +1 -1
  472. package/dist/lib/layouts/layoutProps.d.ts +7 -0
  473. package/dist/lib/layouts/layoutProps.d.ts.map +1 -1
  474. package/dist/lib/layouts/layoutProps.js +11 -0
  475. package/dist/lib/layouts/layoutProps.js.map +1 -1
  476. package/dist/lib/layouts/resolveLayoutProps.d.ts.map +1 -1
  477. package/dist/lib/layouts/resolveLayoutProps.js +13 -11
  478. package/dist/lib/layouts/resolveLayoutProps.js.map +1 -1
  479. package/dist/lib/layouts/types.d.ts +29 -0
  480. package/dist/lib/layouts/types.d.ts.map +1 -1
  481. package/dist/lib/layouts/types.js.map +1 -1
  482. package/dist/lib/material/shapes/Shape.d.ts +8 -0
  483. package/dist/lib/material/shapes/Shape.d.ts.map +1 -0
  484. package/dist/lib/material/shapes/Shape.js +18 -0
  485. package/dist/lib/material/shapes/Shape.js.map +1 -0
  486. package/dist/lib/material/shapes/shapes.d.ts +43 -0
  487. package/dist/lib/material/shapes/shapes.d.ts.map +1 -0
  488. package/dist/lib/material/shapes/shapes.js +2250 -0
  489. package/dist/lib/material/shapes/shapes.js.map +1 -0
  490. package/dist/lib/math.d.ts +23 -0
  491. package/dist/lib/math.d.ts.map +1 -0
  492. package/dist/lib/math.js +31 -0
  493. package/dist/lib/math.js.map +1 -0
  494. package/dist/lib/svg/path/approximate.d.ts +21 -0
  495. package/dist/lib/svg/path/approximate.d.ts.map +1 -0
  496. package/dist/lib/svg/path/approximate.js +57 -0
  497. package/dist/lib/svg/path/approximate.js.map +1 -0
  498. package/dist/lib/svg/path/interpolate.d.ts +5 -0
  499. package/dist/lib/svg/path/interpolate.d.ts.map +1 -0
  500. package/dist/lib/svg/path/interpolate.js +121 -0
  501. package/dist/lib/svg/path/interpolate.js.map +1 -0
  502. package/dist/lib/svg/path/path.d.ts +48 -0
  503. package/dist/lib/svg/path/path.d.ts.map +1 -0
  504. package/dist/lib/svg/path/path.js +50 -0
  505. package/dist/lib/svg/path/path.js.map +1 -0
  506. package/dist/lib/svg/path/point.d.ts +3 -0
  507. package/dist/lib/svg/path/point.d.ts.map +1 -0
  508. package/dist/lib/svg/path/point.js +3 -0
  509. package/dist/lib/svg/path/point.js.map +1 -0
  510. package/dist/lib/svg/path/transform.d.ts +64 -0
  511. package/dist/lib/svg/path/transform.d.ts.map +1 -0
  512. package/dist/lib/svg/path/transform.js +110 -0
  513. package/dist/lib/svg/path/transform.js.map +1 -0
  514. package/dist/lib/tokens/useTokenClassName.d.ts.map +1 -1
  515. package/dist/lib/tokens/useTokenClassName.js +4 -1
  516. package/dist/lib/tokens/useTokenClassName.js.map +1 -1
  517. package/dist/lib/touch/UIPanGestureRecognizer.d.ts.map +1 -1
  518. package/dist/lib/touch/UIPanGestureRecognizer.js +2 -2
  519. package/dist/lib/touch/UIPanGestureRecognizer.js.map +1 -1
  520. package/dist/types.d.ts +9 -0
  521. package/dist/types.d.ts.map +1 -1
  522. package/dist/types.js +1 -4
  523. package/dist/types.js.map +1 -1
  524. package/dist/vkui.css +1 -1
  525. package/dist/vkui.css.map +1 -1
  526. package/package.json +7 -6
  527. package/src/components/ActionSheet/ActionSheet.tsx +6 -3
  528. package/src/components/AdaptivityProvider/AdaptivityContext.tsx +3 -3
  529. package/src/components/AdaptivityProvider/AdaptivityProvider.tsx +2 -2
  530. package/src/components/AppRoot/AppRoot.tsx +1 -14
  531. package/src/components/AppRoot/AppRootContext.ts +0 -2
  532. package/src/components/Calendar/Calendar.tsx +2 -2
  533. package/src/components/CalendarDay/CalendarDay.tsx +4 -2
  534. package/src/components/CalendarDays/CalendarDays.tsx +2 -2
  535. package/src/components/CalendarHeader/CalendarHeader.tsx +4 -2
  536. package/src/components/CalendarRange/CalendarRange.tsx +2 -2
  537. package/src/components/CalendarTime/CalendarTime.module.css +38 -0
  538. package/src/components/CalendarTime/CalendarTime.module.css.d.ts.map +1 -1
  539. package/src/components/CalendarTime/CalendarTime.tsx +68 -55
  540. package/src/components/CalendarTime/CalendarTimePicker.tsx +148 -62
  541. package/src/components/CalendarTime/ComboBox.tsx +189 -0
  542. package/src/components/CardScroll/CardScroll.tsx +6 -5
  543. package/src/components/CarouselBase/CarouselBase.tsx +2 -1
  544. package/src/components/ChipsSelect/useChipsSelect.ts +1 -0
  545. package/src/components/ConfigProvider/ConfigProvider.tsx +6 -3
  546. package/src/components/ConfigProvider/ConfigProviderOverride.tsx +2 -1
  547. package/src/components/ConfigProvider/ConfigProviderSubContexts.tsx +43 -0
  548. package/src/components/ContentBadge/ContentBadge.module.css +84 -91
  549. package/src/components/ContentBadge/ContentBadge.module.css.d.ts.map +1 -1
  550. package/src/components/ContentBadge/ContentBadge.tsx +73 -5
  551. package/src/components/CustomSelect/CustomSelect.tsx +19 -10
  552. package/src/components/DateInput/DateInput.tsx +3 -3
  553. package/src/components/DateRangeInput/DateRangeInput.tsx +2 -2
  554. package/src/components/Epic/ScrollSaver.tsx +1 -0
  555. package/src/components/FixedLayout/ParentWidthWrapper.tsx +48 -0
  556. package/src/components/Flex/Flex.tsx +11 -6
  557. package/src/components/GridAvatar/GridAvatar.module.css +1 -1
  558. package/src/components/GridAvatar/GridAvatar.module.css.d.ts.map +1 -1
  559. package/src/components/ImageBase/ImageBaseFloatElement/ImageBaseFloatElement.tsx +1 -1
  560. package/src/components/NativeSelect/NativeSelect.tsx +4 -2
  561. package/src/components/NavTransitionContext/NavTransitionContext.tsx +5 -1
  562. package/src/components/OnboardingTooltip/OnboardingTooltip.tsx +3 -6
  563. package/src/components/PanelHeader/PanelHeader.tsx +1 -1
  564. package/src/components/Popper/Popper.tsx +8 -5
  565. package/src/components/PullToRefresh/PullToRefresh.module.css +1 -1
  566. package/src/components/PullToRefresh/PullToRefresh.tsx +10 -3
  567. package/src/components/Root/Root.tsx +60 -59
  568. package/src/components/SimpleGrid/SimpleGrid.tsx +25 -11
  569. package/src/components/Skeleton/Skeleton.tsx +6 -4
  570. package/src/components/Snackbar/Snackbar.tsx +6 -3
  571. package/src/components/Spacing/Spacing.tsx +1 -1
  572. package/src/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.module.css +13 -0
  573. package/src/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.module.css.d.ts.map +1 -0
  574. package/src/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.tsx +73 -0
  575. package/src/components/Spinner/ExpressiveSpinner/icons.tsx +104 -0
  576. package/src/components/Spinner/SvgIcon.tsx +31 -0
  577. package/src/components/Spinner/icons.tsx +10 -13
  578. package/src/components/SplitLayout/SplitLayout.tsx +3 -3
  579. package/src/components/TabsItem/TabsItem.tsx +4 -5
  580. package/src/components/Tappable/Tappable.tsx +2 -2
  581. package/src/components/View/View.tsx +83 -89
  582. package/src/components/View/ViewInfinite.tsx +65 -69
  583. package/src/components/WriteBar/WriteBar.tsx +25 -59
  584. package/src/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.module.css +12 -0
  585. package/src/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.module.css.d.ts.map +1 -0
  586. package/src/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.tsx +20 -0
  587. package/src/components/WriteBar/WriteBarFormField/WriteBarFormField.module.css +18 -0
  588. package/src/components/WriteBar/WriteBarFormField/WriteBarFormField.module.css.d.ts.map +1 -0
  589. package/src/components/WriteBar/WriteBarFormField/WriteBarFormField.tsx +22 -0
  590. package/src/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.module.css +3 -0
  591. package/src/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.module.css.d.ts.map +1 -0
  592. package/src/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.tsx +23 -0
  593. package/src/components/WriteBar/WriteBarRoot/WriteBarRoot.module.css +14 -0
  594. package/src/components/WriteBar/WriteBarRoot/WriteBarRoot.module.css.d.ts.map +1 -0
  595. package/src/components/WriteBar/WriteBarRoot/WriteBarRoot.tsx +31 -0
  596. package/src/components/WriteBar/WriteBarTextarea/WriteBarTextarea.module.css +42 -0
  597. package/src/components/WriteBar/WriteBarTextarea/WriteBarTextarea.module.css.d.ts.map +1 -0
  598. package/src/components/WriteBar/WriteBarTextarea/WriteBarTextarea.tsx +48 -0
  599. package/src/helpers/math.ts +8 -0
  600. package/src/hoc/withPlatform.tsx +3 -3
  601. package/src/hooks/useAdaptivityConditionalRender/types.ts +2 -2
  602. package/src/hooks/useAnimationFrame.tsx +42 -0
  603. package/src/hooks/useAutoFocus.ts +1 -1
  604. package/src/hooks/useColorScheme.ts +3 -4
  605. package/src/hooks/useConfigDirection.ts +3 -4
  606. package/src/hooks/useDateInput.ts +1 -2
  607. package/src/hooks/useFocusTrap/useAutoFocus.ts +1 -1
  608. package/src/hooks/useFocusTrap/useFocusTrap.tsx +2 -0
  609. package/src/hooks/useFocusVisible.ts +10 -18
  610. package/src/hooks/useFocusWithin.ts +26 -23
  611. package/src/hooks/useGlobalEscKeyDown.ts +12 -15
  612. package/src/hooks/useGlobalOnClickOutside.ts +5 -2
  613. package/src/hooks/useKeyboardInputTracker.ts +68 -55
  614. package/src/hooks/useLatestRef.ts +12 -0
  615. package/src/hooks/useLocale.ts +3 -4
  616. package/src/hooks/useMediaQueryMatch.ts +1 -1
  617. package/src/hooks/useMutationObserver.ts +2 -3
  618. package/src/hooks/usePlatform.ts +3 -4
  619. package/src/hooks/useResizeObserver.ts +4 -5
  620. package/src/hooks/useSyncHTMLWithBaseVKUIClasses.ts +1 -1
  621. package/src/hooks/useSyncHTMLWithTokens.ts +1 -1
  622. package/src/hooks/useWaitTransitionFinish.ts +15 -15
  623. package/src/index.ts +1 -0
  624. package/src/lib/array.ts +19 -0
  625. package/src/lib/curve.ts +36 -0
  626. package/src/lib/dom.tsx +10 -4
  627. package/src/lib/floating/useFloatingWithInteractions/useFloatingWithInteractions.ts +4 -5
  628. package/src/lib/fx.ts +5 -63
  629. package/src/lib/layouts/index.ts +1 -0
  630. package/src/lib/layouts/layoutProps.ts +8 -0
  631. package/src/lib/layouts/resolveLayoutProps.ts +19 -17
  632. package/src/lib/layouts/types.ts +29 -0
  633. package/src/lib/material/shapes/Shape.tsx +17 -0
  634. package/src/lib/material/shapes/shapes.ts +329 -0
  635. package/src/lib/math.ts +37 -0
  636. package/src/lib/svg/path/approximate.ts +81 -0
  637. package/src/lib/svg/path/interpolate.ts +151 -0
  638. package/src/lib/svg/path/path.ts +102 -0
  639. package/src/lib/svg/path/point.ts +2 -0
  640. package/src/lib/svg/path/transform.ts +147 -0
  641. package/src/lib/tokens/useTokenClassName.ts +7 -5
  642. package/src/lib/touch/UIPanGestureRecognizer.ts +2 -2
  643. package/src/types.ts +16 -0
  644. package/dist/cssm/components/WriteBar/WriteBar.module.css +0 -118
  645. package/dist/cssm/lib/floating/LockFloatingPosition/LockFloatingPosition.js +0 -6
  646. package/dist/cssm/lib/floating/LockFloatingPosition/LockFloatingPosition.js.map +0 -1
  647. package/dist/lib/floating/LockFloatingPosition/LockFloatingPosition.d.ts +0 -6
  648. package/dist/lib/floating/LockFloatingPosition/LockFloatingPosition.d.ts.map +0 -1
  649. package/dist/lib/floating/LockFloatingPosition/LockFloatingPosition.js +0 -6
  650. package/dist/lib/floating/LockFloatingPosition/LockFloatingPosition.js.map +0 -1
  651. package/src/components/WriteBar/WriteBar.module.css +0 -116
  652. package/src/components/WriteBar/WriteBar.module.css.d.ts.map +0 -1
  653. package/src/lib/floating/LockFloatingPosition/LockFloatingPosition.tsx +0 -6
@@ -1,10 +1,10 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
- import { classNames } from "@vkontakte/vkjs";
4
+ import { classNames, noop } from "@vkontakte/vkjs";
5
5
  import { usePlatform } from "../../hooks/usePlatform.js";
6
+ import { useStableCallback } from "../../hooks/useStableCallback.js";
6
7
  import { useDOM } from "../../lib/dom.js";
7
- import { LockFloatingPositionContext } from "../../lib/floating/LockFloatingPosition/LockFloatingPosition.js";
8
8
  import { getNavId } from "../../lib/getNavId.js";
9
9
  import { useIsomorphicLayoutEffect } from "../../lib/useIsomorphicLayoutEffect.js";
10
10
  import { warnOnce } from "../../lib/warnOnce.js";
@@ -18,12 +18,13 @@ import styles from "./Root.module.css";
18
18
  /* eslint-enable jsdoc/require-jsdoc */ const warn = warnOnce('Root');
19
19
  /**
20
20
  * @see https://vkui.io/components/root
21
- */ export const Root = ({ children, activeView: _activeView, onTransition, nav, ...restProps })=>{
21
+ */ export const Root = ({ children, activeView: _activeView, onTransition: onTransitionProp, nav, ...restProps })=>{
22
22
  const scroll = React.useContext(ScrollContext);
23
23
  const platform = usePlatform();
24
24
  const { document } = useDOM();
25
25
  const [scrolls] = React.useState(()=>new Map());
26
26
  const [viewNodes] = React.useState(()=>new Map());
27
+ const onTransition = useStableCallback(onTransitionProp || noop);
27
28
  const { transitionMotionEnabled = true } = useConfigProvider();
28
29
  const { animate } = React.useContext(SplitColContext);
29
30
  const disableAnimation = !transitionMotionEnabled || !animate;
@@ -32,7 +33,7 @@ import styles from "./Root.module.css";
32
33
  activeView: _activeView,
33
34
  transition: false
34
35
  });
35
- const transitionTo = (panel)=>{
36
+ const transitionTo = useStableCallback((panel)=>{
36
37
  if (panel !== activeView) {
37
38
  const viewIds = views.map((view)=>getNavId(view.props, warn));
38
39
  const isBack = viewIds.indexOf(panel) < viewIds.indexOf(activeView);
@@ -44,7 +45,7 @@ import styles from "./Root.module.css";
44
45
  isBack
45
46
  });
46
47
  }
47
- };
48
+ });
48
49
  const finishTransition = React.useCallback(()=>_setState({
49
50
  activeView,
50
51
  prevView,
@@ -58,10 +59,12 @@ import styles from "./Root.module.css";
58
59
  useIsomorphicLayoutEffect(()=>{
59
60
  document.activeElement.blur();
60
61
  }, [
62
+ document,
61
63
  activeView
62
64
  ]);
63
65
  // Нужен переход
64
66
  useIsomorphicLayoutEffect(()=>transitionTo(_activeView), [
67
+ transitionTo,
65
68
  _activeView
66
69
  ]);
67
70
  useIsomorphicLayoutEffect(()=>{
@@ -76,7 +79,12 @@ import styles from "./Root.module.css";
76
79
  }
77
80
  }, [
78
81
  transition,
79
- prevView
82
+ prevView,
83
+ activeView,
84
+ isBack,
85
+ onTransition,
86
+ scroll,
87
+ scrolls
80
88
  ]);
81
89
  React.useEffect(function onAnimationEndFallback() {
82
90
  if (transition && disableAnimation) {
@@ -93,39 +101,37 @@ import styles from "./Root.module.css";
93
101
  }
94
102
  finishTransition();
95
103
  };
96
- return /*#__PURE__*/ _jsx(LockFloatingPositionContext.Provider, {
97
- value: transition,
98
- children: /*#__PURE__*/ _jsx(RootComponent, {
99
- ...restProps,
100
- baseClassName: classNames(styles.host, platform === 'ios' && styles.ios, transition && styles.transition),
101
- children: views.map((view)=>{
102
- const viewId = getNavId(view.props, warn);
103
- if (viewId !== activeView && !(transition && viewId === prevView)) {
104
- return null;
105
- }
106
- const isTransitionTarget = transition && viewId === (isBack ? prevView : activeView);
107
- const compensateScroll = transition && (viewId === prevView || isBack && viewId === activeView);
108
- return /*#__PURE__*/ _jsx("div", {
109
- ref: (e)=>{
110
- viewId && viewNodes.set(viewId, e);
111
- },
112
- onAnimationEnd: isTransitionTarget ? onAnimationEnd : undefined,
113
- className: classNames(styles.view, transition && viewId === prevView && isBack && styles.viewHideBack, transition && viewId === prevView && !isBack && styles.viewHideForward, transition && viewId === activeView && isBack && styles.viewShowBack, transition && viewId === activeView && !isBack && styles.viewShowForward),
114
- children: /*#__PURE__*/ _jsx(NavTransitionDirectionProvider, {
115
- isBack: isBack,
116
- children: /*#__PURE__*/ _jsx(NavTransitionProvider, {
117
- entering: transition && viewId === activeView,
118
- children: /*#__PURE__*/ _jsx("div", {
119
- className: styles.scrollCompensation,
120
- style: {
121
- marginTop: compensateScroll ? viewId && -(scrolls.get(viewId) ?? 0) : undefined
122
- },
123
- children: view
124
- })
104
+ return /*#__PURE__*/ _jsx(RootComponent, {
105
+ ...restProps,
106
+ baseClassName: classNames(styles.host, platform === 'ios' && styles.ios, transition && styles.transition),
107
+ children: views.map((view)=>{
108
+ const viewId = getNavId(view.props, warn);
109
+ if (viewId !== activeView && !(transition && viewId === prevView)) {
110
+ return null;
111
+ }
112
+ const isTransitionTarget = transition && viewId === (isBack ? prevView : activeView);
113
+ const compensateScroll = transition && (viewId === prevView || isBack && viewId === activeView);
114
+ return /*#__PURE__*/ _jsx("div", {
115
+ ref: (e)=>{
116
+ viewId && viewNodes.set(viewId, e);
117
+ },
118
+ onAnimationEnd: isTransitionTarget ? onAnimationEnd : undefined,
119
+ className: classNames(styles.view, transition && viewId === prevView && isBack && styles.viewHideBack, transition && viewId === prevView && !isBack && styles.viewHideForward, transition && viewId === activeView && isBack && styles.viewShowBack, transition && viewId === activeView && !isBack && styles.viewShowForward),
120
+ children: /*#__PURE__*/ _jsx(NavTransitionDirectionProvider, {
121
+ isBack: isBack,
122
+ children: /*#__PURE__*/ _jsx(NavTransitionProvider, {
123
+ entering: transition && viewId === activeView,
124
+ animating: transition,
125
+ children: /*#__PURE__*/ _jsx("div", {
126
+ className: styles.scrollCompensation,
127
+ style: {
128
+ marginTop: compensateScroll ? viewId && -(scrolls.get(viewId) ?? 0) : undefined
129
+ },
130
+ children: view
125
131
  })
126
132
  })
127
- }, viewId);
128
- })
133
+ })
134
+ }, viewId);
129
135
  })
130
136
  });
131
137
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Root/Root.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { useDOM } from '../../lib/dom';\nimport { LockFloatingPositionContext } from '../../lib/floating/LockFloatingPosition/LockFloatingPosition';\nimport { getNavId, type NavIdProps } from '../../lib/getNavId';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { warnOnce } from '../../lib/warnOnce';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport { ScrollContext } from '../AppRoot/ScrollContext';\nimport { useConfigProvider } from '../ConfigProvider/ConfigProviderContext';\nimport { NavTransitionProvider } from '../NavTransitionContext/NavTransitionContext';\nimport { NavTransitionDirectionProvider } from '../NavTransitionDirectionContext/NavTransitionDirectionContext';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport { SplitColContext } from '../SplitCol/SplitColContext';\nimport styles from './Root.module.css';\n\nexport interface RootProps extends HTMLAttributesWithRootRef<HTMLDivElement>, NavIdProps {\n /**\n * `id` активной `View`.\n */\n activeView: string;\n /**\n * Обработчик, который вызывается при завершении анимации смены активной `View`.\n */\n onTransition?: ((params: { isBack: boolean; from: string; to: string }) => void) | undefined;\n /**\n * Коллекция `View`. У каждой `View` должен быть `id`.\n */\n children: React.ReactElement | Iterable<React.ReactElement>;\n}\n\n/* eslint-disable jsdoc/require-jsdoc */\nexport interface RootState {\n activeView: string;\n transition: boolean;\n isBack?: boolean | undefined;\n prevView?: string | undefined;\n}\n/* eslint-enable jsdoc/require-jsdoc */\n\nconst warn = warnOnce('Root');\n\n/**\n * @see https://vkui.io/components/root\n */\nexport const Root = ({\n children,\n activeView: _activeView,\n onTransition,\n nav,\n ...restProps\n}: RootProps): React.ReactNode => {\n const scroll = React.useContext(ScrollContext);\n const platform = usePlatform();\n const { document } = useDOM();\n const [scrolls] = React.useState(() => new Map<string, number>());\n const [viewNodes] = React.useState(() => new Map<string, HTMLElement | null>());\n\n const { transitionMotionEnabled = true } = useConfigProvider();\n const { animate } = React.useContext(SplitColContext);\n const disableAnimation = !transitionMotionEnabled || !animate;\n\n const views = React.Children.toArray(children) as Array<React.ReactElement<NavIdProps>>;\n\n const [{ prevView, activeView, transition, isBack }, _setState] = React.useState<RootState>({\n activeView: _activeView,\n transition: false,\n });\n const transitionTo = (panel: string) => {\n if (panel !== activeView) {\n const viewIds = views.map((view) => getNavId(view.props, warn));\n const isBack = viewIds.indexOf(panel) < viewIds.indexOf(activeView);\n scrolls.set(activeView, scroll.getScroll().y);\n _setState({\n activeView: panel,\n prevView: activeView,\n transition: !disableAnimation,\n isBack,\n });\n }\n };\n const finishTransition = React.useCallback(\n () => _setState({ activeView, prevView, isBack, transition: false }),\n [activeView, isBack, prevView],\n );\n\n useIsomorphicLayoutEffect(() => {\n (document!.activeElement as HTMLElement).blur();\n }, [activeView]);\n\n // Нужен переход\n useIsomorphicLayoutEffect(() => transitionTo(_activeView), [_activeView]);\n useIsomorphicLayoutEffect(() => {\n if (!transition && prevView) {\n // Закончился переход\n scroll.scrollTo(0, isBack ? scrolls.get(activeView) : 0);\n onTransition &&\n onTransition({\n isBack: Boolean(isBack),\n from: prevView,\n to: activeView,\n });\n }\n }, [transition, prevView]);\n\n React.useEffect(\n function onAnimationEndFallback() {\n if (transition && disableAnimation) {\n finishTransition();\n }\n },\n [transition, disableAnimation, finishTransition],\n );\n\n const onAnimationEnd: React.AnimationEventHandler<HTMLElement> = (e) => {\n if (e.target !== e.currentTarget) {\n return;\n }\n\n finishTransition();\n };\n\n return (\n <LockFloatingPositionContext.Provider value={transition}>\n <RootComponent\n {...restProps}\n baseClassName={classNames(\n styles.host,\n platform === 'ios' && styles.ios,\n transition && styles.transition,\n )}\n >\n {views.map((view) => {\n const viewId = getNavId(view.props, warn);\n if (viewId !== activeView && !(transition && viewId === prevView)) {\n return null;\n }\n const isTransitionTarget = transition && viewId === (isBack ? prevView : activeView);\n const compensateScroll =\n transition && (viewId === prevView || (isBack && viewId === activeView));\n return (\n <div\n key={viewId}\n ref={(e) => {\n viewId && viewNodes.set(viewId, e);\n }}\n onAnimationEnd={isTransitionTarget ? onAnimationEnd : undefined}\n className={classNames(\n styles.view,\n transition && viewId === prevView && isBack && styles.viewHideBack,\n transition && viewId === prevView && !isBack && styles.viewHideForward,\n transition && viewId === activeView && isBack && styles.viewShowBack,\n transition && viewId === activeView && !isBack && styles.viewShowForward,\n )}\n >\n <NavTransitionDirectionProvider isBack={isBack}>\n <NavTransitionProvider entering={transition && viewId === activeView}>\n <div\n className={styles.scrollCompensation}\n style={{\n marginTop: compensateScroll\n ? viewId && -(scrolls.get(viewId) ?? 0)\n : undefined,\n }}\n >\n {view}\n </div>\n </NavTransitionProvider>\n </NavTransitionDirectionProvider>\n </div>\n );\n })}\n </RootComponent>\n </LockFloatingPositionContext.Provider>\n );\n};\n"],"names":["React","classNames","usePlatform","useDOM","LockFloatingPositionContext","getNavId","useIsomorphicLayoutEffect","warnOnce","ScrollContext","useConfigProvider","NavTransitionProvider","NavTransitionDirectionProvider","RootComponent","SplitColContext","styles","warn","Root","children","activeView","_activeView","onTransition","nav","restProps","scroll","useContext","platform","document","scrolls","useState","Map","viewNodes","transitionMotionEnabled","animate","disableAnimation","views","Children","toArray","prevView","transition","isBack","_setState","transitionTo","panel","viewIds","map","view","props","indexOf","set","getScroll","y","finishTransition","useCallback","activeElement","blur","scrollTo","get","Boolean","from","to","useEffect","onAnimationEndFallback","onAnimationEnd","e","target","currentTarget","Provider","value","baseClassName","host","ios","viewId","isTransitionTarget","compensateScroll","div","ref","undefined","className","viewHideBack","viewHideForward","viewShowBack","viewShowForward","entering","scrollCompensation","style","marginTop"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/Root/Root.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { useStableCallback } from '../../hooks/useStableCallback';\nimport { useDOM } from '../../lib/dom';\nimport { getNavId, type NavIdProps } from '../../lib/getNavId';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { warnOnce } from '../../lib/warnOnce';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport { ScrollContext } from '../AppRoot/ScrollContext';\nimport { useConfigProvider } from '../ConfigProvider/ConfigProviderContext';\nimport { NavTransitionProvider } from '../NavTransitionContext/NavTransitionContext';\nimport { NavTransitionDirectionProvider } from '../NavTransitionDirectionContext/NavTransitionDirectionContext';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport { SplitColContext } from '../SplitCol/SplitColContext';\nimport styles from './Root.module.css';\n\nexport interface RootProps extends HTMLAttributesWithRootRef<HTMLDivElement>, NavIdProps {\n /**\n * `id` активной `View`.\n */\n activeView: string;\n /**\n * Обработчик, который вызывается при завершении анимации смены активной `View`.\n */\n onTransition?: ((params: { isBack: boolean; from: string; to: string }) => void) | undefined;\n /**\n * Коллекция `View`. У каждой `View` должен быть `id`.\n */\n children: React.ReactElement | Iterable<React.ReactElement>;\n}\n\n/* eslint-disable jsdoc/require-jsdoc */\nexport interface RootState {\n activeView: string;\n transition: boolean;\n isBack?: boolean | undefined;\n prevView?: string | undefined;\n}\n/* eslint-enable jsdoc/require-jsdoc */\n\nconst warn = warnOnce('Root');\n\n/**\n * @see https://vkui.io/components/root\n */\nexport const Root = ({\n children,\n activeView: _activeView,\n onTransition: onTransitionProp,\n nav,\n ...restProps\n}: RootProps): React.ReactNode => {\n const scroll = React.useContext(ScrollContext);\n const platform = usePlatform();\n const { document } = useDOM();\n const [scrolls] = React.useState(() => new Map<string, number>());\n const [viewNodes] = React.useState(() => new Map<string, HTMLElement | null>());\n\n const onTransition = useStableCallback(onTransitionProp || noop);\n\n const { transitionMotionEnabled = true } = useConfigProvider();\n const { animate } = React.useContext(SplitColContext);\n const disableAnimation = !transitionMotionEnabled || !animate;\n\n const views = React.Children.toArray(children) as Array<React.ReactElement<NavIdProps>>;\n\n const [{ prevView, activeView, transition, isBack }, _setState] = React.useState<RootState>({\n activeView: _activeView,\n transition: false,\n });\n const transitionTo = useStableCallback((panel: string) => {\n if (panel !== activeView) {\n const viewIds = views.map((view) => getNavId(view.props, warn));\n const isBack = viewIds.indexOf(panel) < viewIds.indexOf(activeView);\n scrolls.set(activeView, scroll.getScroll().y);\n _setState({\n activeView: panel,\n prevView: activeView,\n transition: !disableAnimation,\n isBack,\n });\n }\n });\n const finishTransition = React.useCallback(\n () => _setState({ activeView, prevView, isBack, transition: false }),\n [activeView, isBack, prevView],\n );\n\n useIsomorphicLayoutEffect(() => {\n (document!.activeElement as HTMLElement).blur();\n }, [document, activeView]);\n\n // Нужен переход\n useIsomorphicLayoutEffect(() => transitionTo(_activeView), [transitionTo, _activeView]);\n useIsomorphicLayoutEffect(() => {\n if (!transition && prevView) {\n // Закончился переход\n scroll.scrollTo(0, isBack ? scrolls.get(activeView) : 0);\n onTransition &&\n onTransition({\n isBack: Boolean(isBack),\n from: prevView,\n to: activeView,\n });\n }\n }, [transition, prevView, activeView, isBack, onTransition, scroll, scrolls]);\n\n React.useEffect(\n function onAnimationEndFallback() {\n if (transition && disableAnimation) {\n finishTransition();\n }\n },\n [transition, disableAnimation, finishTransition],\n );\n\n const onAnimationEnd: React.AnimationEventHandler<HTMLElement> = (e) => {\n if (e.target !== e.currentTarget) {\n return;\n }\n\n finishTransition();\n };\n\n return (\n <RootComponent\n {...restProps}\n baseClassName={classNames(\n styles.host,\n platform === 'ios' && styles.ios,\n transition && styles.transition,\n )}\n >\n {views.map((view) => {\n const viewId = getNavId(view.props, warn);\n if (viewId !== activeView && !(transition && viewId === prevView)) {\n return null;\n }\n const isTransitionTarget = transition && viewId === (isBack ? prevView : activeView);\n const compensateScroll =\n transition && (viewId === prevView || (isBack && viewId === activeView));\n return (\n <div\n key={viewId}\n ref={(e) => {\n viewId && viewNodes.set(viewId, e);\n }}\n onAnimationEnd={isTransitionTarget ? onAnimationEnd : undefined}\n className={classNames(\n styles.view,\n transition && viewId === prevView && isBack && styles.viewHideBack,\n transition && viewId === prevView && !isBack && styles.viewHideForward,\n transition && viewId === activeView && isBack && styles.viewShowBack,\n transition && viewId === activeView && !isBack && styles.viewShowForward,\n )}\n >\n <NavTransitionDirectionProvider isBack={isBack}>\n <NavTransitionProvider\n entering={transition && viewId === activeView}\n animating={transition}\n >\n <div\n className={styles.scrollCompensation}\n style={{\n marginTop: compensateScroll ? viewId && -(scrolls.get(viewId) ?? 0) : undefined,\n }}\n >\n {view}\n </div>\n </NavTransitionProvider>\n </NavTransitionDirectionProvider>\n </div>\n );\n })}\n </RootComponent>\n );\n};\n"],"names":["React","classNames","noop","usePlatform","useStableCallback","useDOM","getNavId","useIsomorphicLayoutEffect","warnOnce","ScrollContext","useConfigProvider","NavTransitionProvider","NavTransitionDirectionProvider","RootComponent","SplitColContext","styles","warn","Root","children","activeView","_activeView","onTransition","onTransitionProp","nav","restProps","scroll","useContext","platform","document","scrolls","useState","Map","viewNodes","transitionMotionEnabled","animate","disableAnimation","views","Children","toArray","prevView","transition","isBack","_setState","transitionTo","panel","viewIds","map","view","props","indexOf","set","getScroll","y","finishTransition","useCallback","activeElement","blur","scrollTo","get","Boolean","from","to","useEffect","onAnimationEndFallback","onAnimationEnd","e","target","currentTarget","baseClassName","host","ios","viewId","isTransitionTarget","compensateScroll","div","ref","undefined","className","viewHideBack","viewHideForward","viewShowBack","viewShowForward","entering","animating","scrollCompensation","style","marginTop"],"mappings":"AAAA;;AAEA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,EAAEC,IAAI,QAAQ,kBAAkB;AACnD,SAASC,WAAW,QAAQ,6BAA0B;AACtD,SAASC,iBAAiB,QAAQ,mCAAgC;AAClE,SAASC,MAAM,QAAQ,mBAAgB;AACvC,SAASC,QAAQ,QAAyB,wBAAqB;AAC/D,SAASC,yBAAyB,QAAQ,yCAAsC;AAChF,SAASC,QAAQ,QAAQ,wBAAqB;AAE9C,SAASC,aAAa,QAAQ,8BAA2B;AACzD,SAASC,iBAAiB,QAAQ,6CAA0C;AAC5E,SAASC,qBAAqB,QAAQ,kDAA+C;AACrF,SAASC,8BAA8B,QAAQ,oEAAiE;AAChH,SAASC,aAAa,QAAQ,oCAAiC;AAC/D,SAASC,eAAe,QAAQ,iCAA8B;AAC9D,OAAOC,YAAY,oBAAoB;AAwBvC,qCAAqC,GAErC,MAAMC,OAAOR,SAAS;AAEtB;;CAEC,GACD,OAAO,MAAMS,OAAO,CAAC,EACnBC,QAAQ,EACRC,YAAYC,WAAW,EACvBC,cAAcC,gBAAgB,EAC9BC,GAAG,EACH,GAAGC,WACO;IACV,MAAMC,SAASzB,MAAM0B,UAAU,CAACjB;IAChC,MAAMkB,WAAWxB;IACjB,MAAM,EAAEyB,QAAQ,EAAE,GAAGvB;IACrB,MAAM,CAACwB,QAAQ,GAAG7B,MAAM8B,QAAQ,CAAC,IAAM,IAAIC;IAC3C,MAAM,CAACC,UAAU,GAAGhC,MAAM8B,QAAQ,CAAC,IAAM,IAAIC;IAE7C,MAAMV,eAAejB,kBAAkBkB,oBAAoBpB;IAE3D,MAAM,EAAE+B,0BAA0B,IAAI,EAAE,GAAGvB;IAC3C,MAAM,EAAEwB,OAAO,EAAE,GAAGlC,MAAM0B,UAAU,CAACZ;IACrC,MAAMqB,mBAAmB,CAACF,2BAA2B,CAACC;IAEtD,MAAME,QAAQpC,MAAMqC,QAAQ,CAACC,OAAO,CAACpB;IAErC,MAAM,CAAC,EAAEqB,QAAQ,EAAEpB,UAAU,EAAEqB,UAAU,EAAEC,MAAM,EAAE,EAAEC,UAAU,GAAG1C,MAAM8B,QAAQ,CAAY;QAC1FX,YAAYC;QACZoB,YAAY;IACd;IACA,MAAMG,eAAevC,kBAAkB,CAACwC;QACtC,IAAIA,UAAUzB,YAAY;YACxB,MAAM0B,UAAUT,MAAMU,GAAG,CAAC,CAACC,OAASzC,SAASyC,KAAKC,KAAK,EAAEhC;YACzD,MAAMyB,SAASI,QAAQI,OAAO,CAACL,SAASC,QAAQI,OAAO,CAAC9B;YACxDU,QAAQqB,GAAG,CAAC/B,YAAYM,OAAO0B,SAAS,GAAGC,CAAC;YAC5CV,UAAU;gBACRvB,YAAYyB;gBACZL,UAAUpB;gBACVqB,YAAY,CAACL;gBACbM;YACF;QACF;IACF;IACA,MAAMY,mBAAmBrD,MAAMsD,WAAW,CACxC,IAAMZ,UAAU;YAAEvB;YAAYoB;YAAUE;YAAQD,YAAY;QAAM,IAClE;QAACrB;QAAYsB;QAAQF;KAAS;IAGhChC,0BAA0B;QACvBqB,SAAU2B,aAAa,CAAiBC,IAAI;IAC/C,GAAG;QAAC5B;QAAUT;KAAW;IAEzB,gBAAgB;IAChBZ,0BAA0B,IAAMoC,aAAavB,cAAc;QAACuB;QAAcvB;KAAY;IACtFb,0BAA0B;QACxB,IAAI,CAACiC,cAAcD,UAAU;YAC3B,qBAAqB;YACrBd,OAAOgC,QAAQ,CAAC,GAAGhB,SAASZ,QAAQ6B,GAAG,CAACvC,cAAc;YACtDE,gBACEA,aAAa;gBACXoB,QAAQkB,QAAQlB;gBAChBmB,MAAMrB;gBACNsB,IAAI1C;YACN;QACJ;IACF,GAAG;QAACqB;QAAYD;QAAUpB;QAAYsB;QAAQpB;QAAcI;QAAQI;KAAQ;IAE5E7B,MAAM8D,SAAS,CACb,SAASC;QACP,IAAIvB,cAAcL,kBAAkB;YAClCkB;QACF;IACF,GACA;QAACb;QAAYL;QAAkBkB;KAAiB;IAGlD,MAAMW,iBAA2D,CAACC;QAChE,IAAIA,EAAEC,MAAM,KAAKD,EAAEE,aAAa,EAAE;YAChC;QACF;QAEAd;IACF;IAEA,qBACE,KAACxC;QACE,GAAGW,SAAS;QACb4C,eAAenE,WACbc,OAAOsD,IAAI,EACX1C,aAAa,SAASZ,OAAOuD,GAAG,EAChC9B,cAAczB,OAAOyB,UAAU;kBAGhCJ,MAAMU,GAAG,CAAC,CAACC;YACV,MAAMwB,SAASjE,SAASyC,KAAKC,KAAK,EAAEhC;YACpC,IAAIuD,WAAWpD,cAAc,CAAEqB,CAAAA,cAAc+B,WAAWhC,QAAO,GAAI;gBACjE,OAAO;YACT;YACA,MAAMiC,qBAAqBhC,cAAc+B,WAAY9B,CAAAA,SAASF,WAAWpB,UAAS;YAClF,MAAMsD,mBACJjC,cAAe+B,CAAAA,WAAWhC,YAAaE,UAAU8B,WAAWpD,UAAU;YACxE,qBACE,KAACuD;gBAECC,KAAK,CAACV;oBACJM,UAAUvC,UAAUkB,GAAG,CAACqB,QAAQN;gBAClC;gBACAD,gBAAgBQ,qBAAqBR,iBAAiBY;gBACtDC,WAAW5E,WACTc,OAAOgC,IAAI,EACXP,cAAc+B,WAAWhC,YAAYE,UAAU1B,OAAO+D,YAAY,EAClEtC,cAAc+B,WAAWhC,YAAY,CAACE,UAAU1B,OAAOgE,eAAe,EACtEvC,cAAc+B,WAAWpD,cAAcsB,UAAU1B,OAAOiE,YAAY,EACpExC,cAAc+B,WAAWpD,cAAc,CAACsB,UAAU1B,OAAOkE,eAAe;0BAG1E,cAAA,KAACrE;oBAA+B6B,QAAQA;8BACtC,cAAA,KAAC9B;wBACCuE,UAAU1C,cAAc+B,WAAWpD;wBACnCgE,WAAW3C;kCAEX,cAAA,KAACkC;4BACCG,WAAW9D,OAAOqE,kBAAkB;4BACpCC,OAAO;gCACLC,WAAWb,mBAAmBF,UAAU,CAAE1C,CAAAA,QAAQ6B,GAAG,CAACa,WAAW,CAAA,IAAKK;4BACxE;sCAEC7B;;;;eAxBFwB;QA8BX;;AAGN,EAAE"}
@@ -4,10 +4,14 @@ import { calculateGap, columnGapClassNames, resolveLayoutProps, rowGapClassNames
4
4
  import { RootComponent } from "../RootComponent/RootComponent.js";
5
5
  import styles from "./SimpleGrid.module.css";
6
6
  const marginClassNames = {
7
+ 'none': undefined,
7
8
  'auto': styles.marginAuto,
8
9
  'auto-inline': styles.marginAutoInline,
9
10
  'auto-block': styles.marginAutoBlock
10
11
  };
12
+ function isSpecialMargin(margin) {
13
+ return margin === 'auto' || margin === 'auto-inline' || margin === 'auto-block' || margin === 'none';
14
+ }
11
15
  const alignClassNames = {
12
16
  start: styles.alignStart,
13
17
  end: styles.alignEnd,
@@ -22,7 +26,10 @@ const displayClassNames = {
22
26
  /**
23
27
  * @see https://vkui.io/components/simple-grid
24
28
  */ export const SimpleGrid = ({ columns = 1, gap = 0, margin = 'none', minColWidth, align = 'stretch', display = 'grid', ...restProps })=>{
25
- const resolvedProps = resolveLayoutProps(restProps);
29
+ const resolvedProps = resolveLayoutProps(isSpecialMargin(margin) ? restProps : {
30
+ ...restProps,
31
+ margin
32
+ });
26
33
  const style = {};
27
34
  const [rowGap, columnGap] = calculateGap(gap);
28
35
  if (typeof rowGap === 'number') {
@@ -36,7 +43,7 @@ const displayClassNames = {
36
43
  style['--vkui_internal--min_col_width'] = `${minColWidth}px`;
37
44
  }
38
45
  return /*#__PURE__*/ _jsx(RootComponent, {
39
- baseClassName: classNames(styles.host, margin !== 'none' && marginClassNames[margin], alignClassNames[align], minColWidth && styles.withMinWidth, typeof columnGap === 'string' && columnGapClassNames[columnGap], typeof rowGap === 'string' && rowGapClassNames[rowGap], display !== 'grid' && displayClassNames[display]),
46
+ baseClassName: classNames(styles.host, isSpecialMargin(margin) && marginClassNames[margin], alignClassNames[align], minColWidth && styles.withMinWidth, typeof columnGap === 'string' && columnGapClassNames[columnGap], typeof rowGap === 'string' && rowGapClassNames[rowGap], display !== 'grid' && displayClassNames[display]),
40
47
  baseStyle: style,
41
48
  ...resolvedProps
42
49
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/SimpleGrid/SimpleGrid.tsx"],"sourcesContent":["import { classNames } from '@vkontakte/vkjs';\nimport {\n calculateGap,\n columnGapClassNames,\n type GapsProp,\n resolveLayoutProps,\n rowGapClassNames,\n} from '../../lib/layouts';\nimport type { LayoutProps } from '../../lib/layouts/types';\nimport type { CSSCustomProperties } from '../../types';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport type { RootComponentProps } from '../RootComponent/RootComponent';\nimport styles from './SimpleGrid.module.css';\n\nconst marginClassNames = {\n 'auto': styles.marginAuto,\n 'auto-inline': styles.marginAutoInline,\n 'auto-block': styles.marginAutoBlock,\n};\n\nconst alignClassNames = {\n start: styles.alignStart,\n end: styles.alignEnd,\n center: styles.alignCenter,\n stretch: styles.alignStretch,\n baseline: styles.alignBaseline,\n};\n\nconst displayClassNames = {\n 'none': styles.displayNone,\n 'inline-grid': styles.displayInlineGrid,\n};\n\nexport interface SimpleGridProps extends RootComponentProps<HTMLElement>, LayoutProps {\n /**\n * Количество колонок.\n */\n columns?: number | undefined;\n /**\n * Отступы между элементами.\n * Значение из списка предопределённых пресетов или число, которое будет приведено к пикселям.\n * Через массив можно задать отступ между столбцами и строками [row, column], если они отличаются.\n */\n gap?: GapsProp | undefined;\n /**\n * Управляет отступами вокруг контейнера\n * Значение `none` позволяет отключить отступы\n * Значение `auto` позволяет задать платформенные отступы\n * Значение `auto-inline` позволяет задать платформенные inline-отступы\n * Значение `auto-block` позволяет задать платформенные block-отступы.\n */\n margin?: 'none' | 'auto' | 'auto-inline' | 'auto-block' | undefined;\n /**\n * Вместо задания количества колонок, можно указать минимальную ширину элементов.\n */\n minColWidth?: number | undefined;\n /**\n * Выравнивание элементов по вспомогательной оси, эквивалентно `align-items`.\n */\n align?: 'start' | 'end' | 'center' | 'stretch' | 'baseline' | undefined;\n /**\n * Возможность задать css-свойство `display`.\n */\n display?: 'none' | 'grid' | 'inline-grid' | undefined;\n}\n\n/**\n * @see https://vkui.io/components/simple-grid\n */\nexport const SimpleGrid = ({\n columns = 1,\n gap = 0,\n margin = 'none',\n minColWidth,\n align = 'stretch',\n display = 'grid',\n ...restProps\n}: SimpleGridProps) => {\n const resolvedProps = resolveLayoutProps(restProps);\n const style: CSSCustomProperties = {};\n const [rowGap, columnGap] = calculateGap(gap);\n if (typeof rowGap === 'number') {\n style['--vkui_internal--row_gap'] = `${rowGap}px`;\n }\n if (typeof columnGap === 'number') {\n style['--vkui_internal--column_gap'] = `${columnGap}px`;\n }\n style['--vkui_internal--grid_columns'] = `${columns}`;\n if (minColWidth) {\n style['--vkui_internal--min_col_width'] = `${minColWidth}px`;\n }\n\n return (\n <RootComponent\n baseClassName={classNames(\n styles.host,\n margin !== 'none' && marginClassNames[margin],\n alignClassNames[align],\n minColWidth && styles.withMinWidth,\n typeof columnGap === 'string' && columnGapClassNames[columnGap],\n typeof rowGap === 'string' && rowGapClassNames[rowGap],\n display !== 'grid' && displayClassNames[display],\n )}\n baseStyle={style}\n {...resolvedProps}\n />\n );\n};\n"],"names":["classNames","calculateGap","columnGapClassNames","resolveLayoutProps","rowGapClassNames","RootComponent","styles","marginClassNames","marginAuto","marginAutoInline","marginAutoBlock","alignClassNames","start","alignStart","end","alignEnd","center","alignCenter","stretch","alignStretch","baseline","alignBaseline","displayClassNames","displayNone","displayInlineGrid","SimpleGrid","columns","gap","margin","minColWidth","align","display","restProps","resolvedProps","style","rowGap","columnGap","baseClassName","host","withMinWidth","baseStyle"],"mappings":";AAAA,SAASA,UAAU,QAAQ,kBAAkB;AAC7C,SACEC,YAAY,EACZC,mBAAmB,EAEnBC,kBAAkB,EAClBC,gBAAgB,QACX,6BAAoB;AAG3B,SAASC,aAAa,QAAQ,oCAAiC;AAE/D,OAAOC,YAAY,0BAA0B;AAE7C,MAAMC,mBAAmB;IACvB,QAAQD,OAAOE,UAAU;IACzB,eAAeF,OAAOG,gBAAgB;IACtC,cAAcH,OAAOI,eAAe;AACtC;AAEA,MAAMC,kBAAkB;IACtBC,OAAON,OAAOO,UAAU;IACxBC,KAAKR,OAAOS,QAAQ;IACpBC,QAAQV,OAAOW,WAAW;IAC1BC,SAASZ,OAAOa,YAAY;IAC5BC,UAAUd,OAAOe,aAAa;AAChC;AAEA,MAAMC,oBAAoB;IACxB,QAAQhB,OAAOiB,WAAW;IAC1B,eAAejB,OAAOkB,iBAAiB;AACzC;AAmCA;;CAEC,GACD,OAAO,MAAMC,aAAa,CAAC,EACzBC,UAAU,CAAC,EACXC,MAAM,CAAC,EACPC,SAAS,MAAM,EACfC,WAAW,EACXC,QAAQ,SAAS,EACjBC,UAAU,MAAM,EAChB,GAAGC,WACa;IAChB,MAAMC,gBAAgB9B,mBAAmB6B;IACzC,MAAME,QAA6B,CAAC;IACpC,MAAM,CAACC,QAAQC,UAAU,GAAGnC,aAAa0B;IACzC,IAAI,OAAOQ,WAAW,UAAU;QAC9BD,KAAK,CAAC,2BAA2B,GAAG,GAAGC,OAAO,EAAE,CAAC;IACnD;IACA,IAAI,OAAOC,cAAc,UAAU;QACjCF,KAAK,CAAC,8BAA8B,GAAG,GAAGE,UAAU,EAAE,CAAC;IACzD;IACAF,KAAK,CAAC,gCAAgC,GAAG,GAAGR,SAAS;IACrD,IAAIG,aAAa;QACfK,KAAK,CAAC,iCAAiC,GAAG,GAAGL,YAAY,EAAE,CAAC;IAC9D;IAEA,qBACE,KAACxB;QACCgC,eAAerC,WACbM,OAAOgC,IAAI,EACXV,WAAW,UAAUrB,gBAAgB,CAACqB,OAAO,EAC7CjB,eAAe,CAACmB,MAAM,EACtBD,eAAevB,OAAOiC,YAAY,EAClC,OAAOH,cAAc,YAAYlC,mBAAmB,CAACkC,UAAU,EAC/D,OAAOD,WAAW,YAAY/B,gBAAgB,CAAC+B,OAAO,EACtDJ,YAAY,UAAUT,iBAAiB,CAACS,QAAQ;QAElDS,WAAWN;QACV,GAAGD,aAAa;;AAGvB,EAAE"}
1
+ {"version":3,"sources":["../../../../src/components/SimpleGrid/SimpleGrid.tsx"],"sourcesContent":["import { classNames } from '@vkontakte/vkjs';\nimport {\n calculateGap,\n columnGapClassNames,\n type GapsProp,\n resolveLayoutProps,\n rowGapClassNames,\n} from '../../lib/layouts';\nimport type { LayoutProps, MarginProp } from '../../lib/layouts/types';\nimport type { CSSCustomProperties } from '../../types';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport type { RootComponentProps } from '../RootComponent/RootComponent';\nimport styles from './SimpleGrid.module.css';\n\ntype SpecificMargin = 'auto' | 'auto-inline' | 'auto-block' | 'none';\n\nconst marginClassNames: Record<SpecificMargin, string | undefined> = {\n 'none': undefined,\n 'auto': styles.marginAuto,\n 'auto-inline': styles.marginAutoInline,\n 'auto-block': styles.marginAutoBlock,\n};\n\nfunction isSpecialMargin(margin: SimpleGridProps['margin']): margin is SpecificMargin {\n return (\n margin === 'auto' || margin === 'auto-inline' || margin === 'auto-block' || margin === 'none'\n );\n}\n\nconst alignClassNames = {\n start: styles.alignStart,\n end: styles.alignEnd,\n center: styles.alignCenter,\n stretch: styles.alignStretch,\n baseline: styles.alignBaseline,\n};\n\nconst displayClassNames = {\n 'none': styles.displayNone,\n 'inline-grid': styles.displayInlineGrid,\n};\n\nexport interface SimpleGridProps\n extends RootComponentProps<HTMLElement>,\n Omit<LayoutProps, 'margin'> {\n /**\n * Количество колонок.\n */\n columns?: number | undefined;\n /**\n * Отступы между элементами.\n * Значение из списка предопределённых пресетов или число, которое будет приведено к пикселям.\n * Через массив можно задать отступ между столбцами и строками [row, column], если они отличаются.\n */\n gap?: GapsProp | undefined;\n /**\n * Внешние отступы контейнера.\n * Дополнительно поддерживаются специальные значения:\n * `none` отключает дополнительные отступы;\n * `auto` включает платформенные отступы вокруг контейнера;\n * `auto-inline` включает платформенные inline-отступы;\n * `auto-block` включает платформенные block-отступы.\n */\n margin?: 'none' | 'auto' | 'auto-inline' | 'auto-block' | MarginProp | undefined;\n /**\n * Вместо задания количества колонок, можно указать минимальную ширину элементов.\n */\n minColWidth?: number | undefined;\n /**\n * Выравнивание элементов по вспомогательной оси, эквивалентно `align-items`.\n */\n align?: 'start' | 'end' | 'center' | 'stretch' | 'baseline' | undefined;\n /**\n * Возможность задать css-свойство `display`.\n */\n display?: 'none' | 'grid' | 'inline-grid' | undefined;\n}\n\n/**\n * @see https://vkui.io/components/simple-grid\n */\nexport const SimpleGrid = ({\n columns = 1,\n gap = 0,\n margin = 'none',\n minColWidth,\n align = 'stretch',\n display = 'grid',\n ...restProps\n}: SimpleGridProps) => {\n const resolvedProps = resolveLayoutProps(\n isSpecialMargin(margin) ? restProps : { ...restProps, margin },\n );\n const style: CSSCustomProperties = {};\n const [rowGap, columnGap] = calculateGap(gap);\n if (typeof rowGap === 'number') {\n style['--vkui_internal--row_gap'] = `${rowGap}px`;\n }\n if (typeof columnGap === 'number') {\n style['--vkui_internal--column_gap'] = `${columnGap}px`;\n }\n style['--vkui_internal--grid_columns'] = `${columns}`;\n if (minColWidth) {\n style['--vkui_internal--min_col_width'] = `${minColWidth}px`;\n }\n\n return (\n <RootComponent\n baseClassName={classNames(\n styles.host,\n isSpecialMargin(margin) && marginClassNames[margin],\n alignClassNames[align],\n minColWidth && styles.withMinWidth,\n typeof columnGap === 'string' && columnGapClassNames[columnGap],\n typeof rowGap === 'string' && rowGapClassNames[rowGap],\n display !== 'grid' && displayClassNames[display],\n )}\n baseStyle={style}\n {...resolvedProps}\n />\n );\n};\n"],"names":["classNames","calculateGap","columnGapClassNames","resolveLayoutProps","rowGapClassNames","RootComponent","styles","marginClassNames","undefined","marginAuto","marginAutoInline","marginAutoBlock","isSpecialMargin","margin","alignClassNames","start","alignStart","end","alignEnd","center","alignCenter","stretch","alignStretch","baseline","alignBaseline","displayClassNames","displayNone","displayInlineGrid","SimpleGrid","columns","gap","minColWidth","align","display","restProps","resolvedProps","style","rowGap","columnGap","baseClassName","host","withMinWidth","baseStyle"],"mappings":";AAAA,SAASA,UAAU,QAAQ,kBAAkB;AAC7C,SACEC,YAAY,EACZC,mBAAmB,EAEnBC,kBAAkB,EAClBC,gBAAgB,QACX,6BAAoB;AAG3B,SAASC,aAAa,QAAQ,oCAAiC;AAE/D,OAAOC,YAAY,0BAA0B;AAI7C,MAAMC,mBAA+D;IACnE,QAAQC;IACR,QAAQF,OAAOG,UAAU;IACzB,eAAeH,OAAOI,gBAAgB;IACtC,cAAcJ,OAAOK,eAAe;AACtC;AAEA,SAASC,gBAAgBC,MAAiC;IACxD,OACEA,WAAW,UAAUA,WAAW,iBAAiBA,WAAW,gBAAgBA,WAAW;AAE3F;AAEA,MAAMC,kBAAkB;IACtBC,OAAOT,OAAOU,UAAU;IACxBC,KAAKX,OAAOY,QAAQ;IACpBC,QAAQb,OAAOc,WAAW;IAC1BC,SAASf,OAAOgB,YAAY;IAC5BC,UAAUjB,OAAOkB,aAAa;AAChC;AAEA,MAAMC,oBAAoB;IACxB,QAAQnB,OAAOoB,WAAW;IAC1B,eAAepB,OAAOqB,iBAAiB;AACzC;AAsCA;;CAEC,GACD,OAAO,MAAMC,aAAa,CAAC,EACzBC,UAAU,CAAC,EACXC,MAAM,CAAC,EACPjB,SAAS,MAAM,EACfkB,WAAW,EACXC,QAAQ,SAAS,EACjBC,UAAU,MAAM,EAChB,GAAGC,WACa;IAChB,MAAMC,gBAAgBhC,mBACpBS,gBAAgBC,UAAUqB,YAAY;QAAE,GAAGA,SAAS;QAAErB;IAAO;IAE/D,MAAMuB,QAA6B,CAAC;IACpC,MAAM,CAACC,QAAQC,UAAU,GAAGrC,aAAa6B;IACzC,IAAI,OAAOO,WAAW,UAAU;QAC9BD,KAAK,CAAC,2BAA2B,GAAG,GAAGC,OAAO,EAAE,CAAC;IACnD;IACA,IAAI,OAAOC,cAAc,UAAU;QACjCF,KAAK,CAAC,8BAA8B,GAAG,GAAGE,UAAU,EAAE,CAAC;IACzD;IACAF,KAAK,CAAC,gCAAgC,GAAG,GAAGP,SAAS;IACrD,IAAIE,aAAa;QACfK,KAAK,CAAC,iCAAiC,GAAG,GAAGL,YAAY,EAAE,CAAC;IAC9D;IAEA,qBACE,KAAC1B;QACCkC,eAAevC,WACbM,OAAOkC,IAAI,EACX5B,gBAAgBC,WAAWN,gBAAgB,CAACM,OAAO,EACnDC,eAAe,CAACkB,MAAM,EACtBD,eAAezB,OAAOmC,YAAY,EAClC,OAAOH,cAAc,YAAYpC,mBAAmB,CAACoC,UAAU,EAC/D,OAAOD,WAAW,YAAYjC,gBAAgB,CAACiC,OAAO,EACtDJ,YAAY,UAAUR,iBAAiB,CAACQ,QAAQ;QAElDS,WAAWN;QACV,GAAGD,aAAa;;AAGvB,EAAE"}
@@ -62,20 +62,19 @@ const CUSTOM_PROPERTY_GRADIENT_LEFT = '--vkui_internal--skeleton_gradient_left';
62
62
  /**
63
63
  * Вычисляет позицию скелетона.
64
64
  */ function useSkeletonPosition(rootRef) {
65
- const { document, window } = useDOM();
65
+ const { window } = useDOM();
66
66
  const [[skeletonGradientLeft, prevSkeletonGradientLeft], setSkeletonGradientLeft] = useStateWithPrev('0');
67
67
  const updatePosition = React.useCallback(()=>{
68
68
  const el = rootRef.current;
69
- if (!el || !document) {
69
+ if (!el) {
70
70
  return;
71
71
  }
72
- const value = -(el.getBoundingClientRect().left - document.body.getBoundingClientRect().left);
72
+ const value = -(el.getBoundingClientRect().left - el.ownerDocument.body.getBoundingClientRect().left);
73
73
  const gradientValue = value === 0 ? '0' : `${value}px`;
74
74
  if (prevSkeletonGradientLeft !== gradientValue) {
75
75
  setSkeletonGradientLeft(gradientValue);
76
76
  }
77
77
  }, [
78
- document,
79
78
  prevSkeletonGradientLeft,
80
79
  rootRef,
81
80
  setSkeletonGradientLeft
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Skeleton/Skeleton.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { mergeStyle } from '../../helpers/mergeStyle';\nimport { useBooleanState } from '../../hooks/useBooleanState';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useResizeObserver } from '../../hooks/useResizeObserver';\nimport { useStateWithPrev } from '../../hooks/useStateWithPrev';\nimport { millisecondsInSecond } from '../../lib/date';\nimport { useDOM } from '../../lib/dom';\nimport { animationVisibilityDelayStyles } from '../../styles/animationVisibilityDelay';\nimport type { CSSCustomProperties, HTMLAttributesWithRootRef } from '../../types';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './Skeleton.module.css';\nimport stylesDelay from '../../styles/animationVisibilityDelay.module.css';\n\nconst CUSTOM_PROPERTY_GRADIENT_LEFT = '--vkui_internal--skeleton_gradient_left';\n\n/**\n * Синхронизирует анимацию скелетонов с помощью временных отрезков.\n *\n * ## visibilitychange\n *\n * В синхронизацию не заложен механизм перехода на оптимизации браузеров при\n * переходе на другую вкладку, поскольку нет уверенности в реальности таких\n * кейсов со скелетонами. Если такой кейс принесут, необходимо обработать\n * событие `visibilitychange` используя функцию `syncAnimation`.\n *\n * Смотри https://developer.chrome.com/blog/page-lifecycle-api/.\n *\n * @param duration Длительность анимации в секундах.\n */\nfunction useSkeletonSyncAnimation(disableAnimation: boolean, duration = 1.5) {\n const [isAnimationStarted, setIsAnimationStartedTrue, setIsAnimationStartedFalse] =\n useBooleanState();\n const timer = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n const syncAnimation = React.useCallback(() => {\n clearTimeout(timer.current);\n setIsAnimationStartedFalse();\n\n const durationInMilliseconds = duration * millisecondsInSecond;\n const delay = durationInMilliseconds - (performance.now() % durationInMilliseconds);\n\n timer.current = setTimeout(setIsAnimationStartedTrue, delay);\n\n return () => clearTimeout(timer.current);\n }, [duration, setIsAnimationStartedFalse, setIsAnimationStartedTrue]);\n\n React.useEffect(() => {\n if (disableAnimation) {\n setIsAnimationStartedFalse();\n return;\n }\n\n if (isAnimationStarted) {\n return;\n }\n\n return syncAnimation();\n }, [disableAnimation, isAnimationStarted, setIsAnimationStartedFalse, syncAnimation]);\n\n return isAnimationStarted;\n}\n\n/**\n * Вычисляет позицию скелетона.\n */\nfunction useSkeletonPosition(rootRef: React.RefObject<HTMLElement | null>) {\n const { document, window } = useDOM();\n const [[skeletonGradientLeft, prevSkeletonGradientLeft], setSkeletonGradientLeft] =\n useStateWithPrev('0');\n\n const updatePosition = React.useCallback(() => {\n const el = rootRef.current;\n if (!el || !document) {\n return;\n }\n\n const value = -(el.getBoundingClientRect().left - document.body.getBoundingClientRect().left);\n const gradientValue = value === 0 ? '0' : `${value}px`;\n if (prevSkeletonGradientLeft !== gradientValue) {\n setSkeletonGradientLeft(gradientValue);\n }\n }, [document, prevSkeletonGradientLeft, rootRef, setSkeletonGradientLeft]);\n\n React.useEffect(updatePosition, [updatePosition]);\n useResizeObserver(window, updatePosition);\n\n return skeletonGradientLeft;\n}\n\nexport interface SkeletonProps\n extends HTMLAttributesWithRootRef<HTMLDivElement | HTMLSpanElement>,\n Pick<\n React.CSSProperties,\n | 'width'\n | 'height'\n | 'inlineSize'\n | 'blockSize'\n | 'maxWidth'\n | 'maxInlineSize'\n | 'borderRadius'\n | 'margin'\n > {\n /**\n * Начальный цвет анимации.\n */\n colorFrom?: string | undefined;\n\n /**\n * Финальный цвет анимации.\n */\n colorTo?: string | undefined;\n\n /**\n * Выключает анимацию, в результате чего показывается только один цвет.\n */\n noAnimation?: boolean | undefined;\n\n /**\n * Длительность анимации в секундах.\n */\n duration?: number | undefined;\n\n /**\n * Задерживает отрисовку элемента на заданное количество миллисекунд.\n */\n visibilityDelay?: number | undefined;\n}\n\n/**\n * > Старайтесь минимизировать количество заглушек на экране. Не каждый элемент\n * > на экране должен заменяться заглушкой.\n * >\n * > Текстовые блоки лучше сокращать до трёх строк. Ширина последней строки\n * > скелета вычисляется, как 75% от ширины текстового блока. Высота скелетона\n * > автоматически подстраивается под размер шрифта, поэтому идеально\n * > вписывается в слоты компонентов, которые обычно ожидают текст.\n *\n * @since 6.1.0\n *\n * @see https://vkui.io/components/skeleton\n *\n */\nexport const Skeleton = ({\n width,\n height,\n inlineSize,\n blockSize,\n maxWidth,\n maxInlineSize,\n borderRadius,\n children,\n colorFrom,\n colorTo,\n noAnimation = false,\n duration,\n margin,\n getRootRef,\n visibilityDelay,\n ...restProps\n}: SkeletonProps): React.ReactNode => {\n const rootRef = useExternRef(getRootRef);\n\n const disableAnimation = !useSkeletonSyncAnimation(noAnimation, duration);\n const skeletonGradientLeft = useSkeletonPosition(rootRef);\n\n const skeletonStyle: React.CSSProperties & CSSCustomProperties = {\n width,\n height,\n inlineSize,\n blockSize,\n maxWidth,\n maxInlineSize,\n borderRadius,\n margin,\n [CUSTOM_PROPERTY_GRADIENT_LEFT]: skeletonGradientLeft,\n };\n\n if (colorFrom) {\n skeletonStyle['--vkui_internal--skeleton_color_from'] = colorFrom;\n }\n\n if (colorTo) {\n skeletonStyle['--vkui_internal--skeleton_color_to'] = colorTo;\n }\n\n if (Number.isFinite(duration)) {\n skeletonStyle['--vkui_internal--skeleton_animation_duration'] = `${duration}s`;\n }\n\n return (\n <RootComponent\n getRootRef={rootRef}\n Component=\"span\"\n baseClassName={classNames(\n styles.host,\n disableAnimation && styles.disableAnimation,\n visibilityDelay && stylesDelay.visibilityDelay,\n )}\n baseStyle={mergeStyle(skeletonStyle, animationVisibilityDelayStyles(visibilityDelay))}\n {...restProps}\n >\n {children || <>&zwnj;</>}\n </RootComponent>\n );\n};\n"],"names":["React","classNames","mergeStyle","useBooleanState","useExternRef","useResizeObserver","useStateWithPrev","millisecondsInSecond","useDOM","animationVisibilityDelayStyles","RootComponent","styles","stylesDelay","CUSTOM_PROPERTY_GRADIENT_LEFT","useSkeletonSyncAnimation","disableAnimation","duration","isAnimationStarted","setIsAnimationStartedTrue","setIsAnimationStartedFalse","timer","useRef","undefined","syncAnimation","useCallback","clearTimeout","current","durationInMilliseconds","delay","performance","now","setTimeout","useEffect","useSkeletonPosition","rootRef","document","window","skeletonGradientLeft","prevSkeletonGradientLeft","setSkeletonGradientLeft","updatePosition","el","value","getBoundingClientRect","left","body","gradientValue","Skeleton","width","height","inlineSize","blockSize","maxWidth","maxInlineSize","borderRadius","children","colorFrom","colorTo","noAnimation","margin","getRootRef","visibilityDelay","restProps","skeletonStyle","Number","isFinite","Component","baseClassName","host","baseStyle"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/Skeleton/Skeleton.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { mergeStyle } from '../../helpers/mergeStyle';\nimport { useBooleanState } from '../../hooks/useBooleanState';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useResizeObserver } from '../../hooks/useResizeObserver';\nimport { useStateWithPrev } from '../../hooks/useStateWithPrev';\nimport { millisecondsInSecond } from '../../lib/date';\nimport { useDOM } from '../../lib/dom';\nimport { animationVisibilityDelayStyles } from '../../styles/animationVisibilityDelay';\nimport type { CSSCustomProperties, HTMLAttributesWithRootRef } from '../../types';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './Skeleton.module.css';\nimport stylesDelay from '../../styles/animationVisibilityDelay.module.css';\n\nconst CUSTOM_PROPERTY_GRADIENT_LEFT = '--vkui_internal--skeleton_gradient_left';\n\n/**\n * Синхронизирует анимацию скелетонов с помощью временных отрезков.\n *\n * ## visibilitychange\n *\n * В синхронизацию не заложен механизм перехода на оптимизации браузеров при\n * переходе на другую вкладку, поскольку нет уверенности в реальности таких\n * кейсов со скелетонами. Если такой кейс принесут, необходимо обработать\n * событие `visibilitychange` используя функцию `syncAnimation`.\n *\n * Смотри https://developer.chrome.com/blog/page-lifecycle-api/.\n *\n * @param duration Длительность анимации в секундах.\n */\nfunction useSkeletonSyncAnimation(disableAnimation: boolean, duration = 1.5) {\n const [isAnimationStarted, setIsAnimationStartedTrue, setIsAnimationStartedFalse] =\n useBooleanState();\n const timer = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n const syncAnimation = React.useCallback(() => {\n clearTimeout(timer.current);\n setIsAnimationStartedFalse();\n\n const durationInMilliseconds = duration * millisecondsInSecond;\n const delay = durationInMilliseconds - (performance.now() % durationInMilliseconds);\n\n timer.current = setTimeout(setIsAnimationStartedTrue, delay);\n\n return () => clearTimeout(timer.current);\n }, [duration, setIsAnimationStartedFalse, setIsAnimationStartedTrue]);\n\n React.useEffect(() => {\n if (disableAnimation) {\n setIsAnimationStartedFalse();\n return;\n }\n\n if (isAnimationStarted) {\n return;\n }\n\n return syncAnimation();\n }, [disableAnimation, isAnimationStarted, setIsAnimationStartedFalse, syncAnimation]);\n\n return isAnimationStarted;\n}\n\n/**\n * Вычисляет позицию скелетона.\n */\nfunction useSkeletonPosition(rootRef: React.RefObject<HTMLElement | null>) {\n const { window } = useDOM();\n const [[skeletonGradientLeft, prevSkeletonGradientLeft], setSkeletonGradientLeft] =\n useStateWithPrev('0');\n\n const updatePosition = React.useCallback(() => {\n const el = rootRef.current;\n if (!el) {\n return;\n }\n\n const value = -(\n el.getBoundingClientRect().left - el.ownerDocument.body.getBoundingClientRect().left\n );\n const gradientValue = value === 0 ? '0' : `${value}px`;\n if (prevSkeletonGradientLeft !== gradientValue) {\n setSkeletonGradientLeft(gradientValue);\n }\n }, [prevSkeletonGradientLeft, rootRef, setSkeletonGradientLeft]);\n\n React.useEffect(updatePosition, [updatePosition]);\n useResizeObserver(window, updatePosition);\n\n return skeletonGradientLeft;\n}\n\nexport interface SkeletonProps\n extends HTMLAttributesWithRootRef<HTMLDivElement | HTMLSpanElement>,\n Pick<\n React.CSSProperties,\n | 'width'\n | 'height'\n | 'inlineSize'\n | 'blockSize'\n | 'maxWidth'\n | 'maxInlineSize'\n | 'borderRadius'\n | 'margin'\n > {\n /**\n * Начальный цвет анимации.\n */\n colorFrom?: string | undefined;\n\n /**\n * Финальный цвет анимации.\n */\n colorTo?: string | undefined;\n\n /**\n * Выключает анимацию, в результате чего показывается только один цвет.\n */\n noAnimation?: boolean | undefined;\n\n /**\n * Длительность анимации в секундах.\n */\n duration?: number | undefined;\n\n /**\n * Задерживает отрисовку элемента на заданное количество миллисекунд.\n */\n visibilityDelay?: number | undefined;\n}\n\n/**\n * > Старайтесь минимизировать количество заглушек на экране. Не каждый элемент\n * > на экране должен заменяться заглушкой.\n * >\n * > Текстовые блоки лучше сокращать до трёх строк. Ширина последней строки\n * > скелета вычисляется, как 75% от ширины текстового блока. Высота скелетона\n * > автоматически подстраивается под размер шрифта, поэтому идеально\n * > вписывается в слоты компонентов, которые обычно ожидают текст.\n *\n * @since 6.1.0\n *\n * @see https://vkui.io/components/skeleton\n *\n */\nexport const Skeleton = ({\n width,\n height,\n inlineSize,\n blockSize,\n maxWidth,\n maxInlineSize,\n borderRadius,\n children,\n colorFrom,\n colorTo,\n noAnimation = false,\n duration,\n margin,\n getRootRef,\n visibilityDelay,\n ...restProps\n}: SkeletonProps): React.ReactNode => {\n const rootRef = useExternRef(getRootRef);\n\n const disableAnimation = !useSkeletonSyncAnimation(noAnimation, duration);\n const skeletonGradientLeft = useSkeletonPosition(rootRef);\n\n const skeletonStyle: React.CSSProperties & CSSCustomProperties = {\n width,\n height,\n inlineSize,\n blockSize,\n maxWidth,\n maxInlineSize,\n borderRadius,\n margin,\n [CUSTOM_PROPERTY_GRADIENT_LEFT]: skeletonGradientLeft,\n };\n\n if (colorFrom) {\n skeletonStyle['--vkui_internal--skeleton_color_from'] = colorFrom;\n }\n\n if (colorTo) {\n skeletonStyle['--vkui_internal--skeleton_color_to'] = colorTo;\n }\n\n if (Number.isFinite(duration)) {\n skeletonStyle['--vkui_internal--skeleton_animation_duration'] = `${duration}s`;\n }\n\n return (\n <RootComponent\n getRootRef={rootRef}\n Component=\"span\"\n baseClassName={classNames(\n styles.host,\n disableAnimation && styles.disableAnimation,\n visibilityDelay && stylesDelay.visibilityDelay,\n )}\n baseStyle={mergeStyle(skeletonStyle, animationVisibilityDelayStyles(visibilityDelay))}\n {...restProps}\n >\n {children || <>&zwnj;</>}\n </RootComponent>\n );\n};\n"],"names":["React","classNames","mergeStyle","useBooleanState","useExternRef","useResizeObserver","useStateWithPrev","millisecondsInSecond","useDOM","animationVisibilityDelayStyles","RootComponent","styles","stylesDelay","CUSTOM_PROPERTY_GRADIENT_LEFT","useSkeletonSyncAnimation","disableAnimation","duration","isAnimationStarted","setIsAnimationStartedTrue","setIsAnimationStartedFalse","timer","useRef","undefined","syncAnimation","useCallback","clearTimeout","current","durationInMilliseconds","delay","performance","now","setTimeout","useEffect","useSkeletonPosition","rootRef","window","skeletonGradientLeft","prevSkeletonGradientLeft","setSkeletonGradientLeft","updatePosition","el","value","getBoundingClientRect","left","ownerDocument","body","gradientValue","Skeleton","width","height","inlineSize","blockSize","maxWidth","maxInlineSize","borderRadius","children","colorFrom","colorTo","noAnimation","margin","getRootRef","visibilityDelay","restProps","skeletonStyle","Number","isFinite","Component","baseClassName","host","baseStyle"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { useContext } from "react";
4
4
  import * as React from "react";
5
- import { classNames } from "@vkontakte/vkjs";
5
+ import { classNames, noop } from "@vkontakte/vkjs";
6
6
  import { useConfigDirection } from "../../hooks/useConfigDirection.js";
7
7
  import { useExternRef } from "../../hooks/useExternRef.js";
8
8
  import { useFocusWithin } from "../../hooks/useFocusWithin.js";
@@ -11,6 +11,7 @@ import { useMediaQueries } from "../../hooks/useMediaQueries.js";
11
11
  import { useMergeProps } from "../../hooks/useMergeProps.js";
12
12
  import { usePlatform } from "../../hooks/usePlatform.js";
13
13
  import { SnackbarsContainerContext } from "../../hooks/useSnackbarManager/components/SnackbarsContainerContext.js";
14
+ import { useStableCallback } from "../../hooks/useStableCallback.js";
14
15
  import { useCSSKeyframesAnimationController } from "../../lib/animation/index.js";
15
16
  import { callMultiple } from "../../lib/callMultiple.js";
16
17
  import { getRelativeBoundingClientRect } from "../../lib/dom.js";
@@ -39,7 +40,7 @@ const animationStateClassNames = {
39
40
  };
40
41
  /**
41
42
  * @see https://vkui.io/components/snackbar
42
- */ export const Snackbar = ({ placement = 'bottom-start', children, layout, action, before, after, duration = 4000, onActionClick: onActionClickProp, onClosed, onClose, mode = 'default', subtitle, offsetY, getRootRef: getRootRefProp, slotProps, open: openProp, id, ...restProps })=>{
43
+ */ export const Snackbar = ({ placement = 'bottom-start', children, layout, action, before, after, duration = 4000, onActionClick: onActionClickProp, onClosed, onClose: onCloseProp, mode = 'default', subtitle, offsetY, getRootRef: getRootRefProp, slotProps, open: openProp, id, ...restProps })=>{
43
44
  const { getRootRef, ...rootRest } = useMergeProps({
44
45
  getRootRef: getRootRefProp,
45
46
  ...restProps
@@ -47,6 +48,7 @@ const animationStateClassNames = {
47
48
  const { onClick: onActionClick, ...actionRest } = useMergeProps({
48
49
  onClick: onActionClickProp
49
50
  }, slotProps?.action);
51
+ const onClose = useStableCallback(onCloseProp || noop);
50
52
  const platform = usePlatform();
51
53
  const { isInsideContainer, onOpen, onClosed: onClosedFromContext } = useContext(SnackbarsContainerContext);
52
54
  const [open, setOpen] = React.useState(openProp !== undefined ? openProp : true);
@@ -73,7 +75,8 @@ const animationStateClassNames = {
73
75
  setOpen(openProp);
74
76
  }
75
77
  }, [
76
- openProp
78
+ openProp,
79
+ onClose
77
80
  ]);
78
81
  const clearRAF = React.useCallback(()=>{
79
82
  if (rafRef.current !== null) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Snackbar/Snackbar.tsx"],"sourcesContent":["'use client';\n\nimport { useContext } from 'react';\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useConfigDirection } from '../../hooks/useConfigDirection';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useFocusWithin } from '../../hooks/useFocusWithin';\nimport { useGlobalEscKeyDown } from '../../hooks/useGlobalEscKeyDown';\nimport { useMediaQueries } from '../../hooks/useMediaQueries';\nimport { useMergeProps } from '../../hooks/useMergeProps';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { SnackbarsContainerContext } from '../../hooks/useSnackbarManager/components/SnackbarsContainerContext';\nimport { useCSSKeyframesAnimationController } from '../../lib/animation';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { getRelativeBoundingClientRect } from '../../lib/dom';\nimport { UIPanGestureRecognizer } from '../../lib/touch';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport type { HasDataAttribute, HasRootRef, HTMLAttributesWithRootRef } from '../../types';\nimport { Button } from '../Button/Button';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport { Basic, type BasicProps } from './subcomponents/Basic/Basic';\nimport type { ShiftData, SnackbarPlacement } from './types';\nimport {\n getInitialShiftData,\n getMovedShiftData,\n resolveOffsetYCssStyle,\n shouldBeClosedByShiftData,\n} from './utils';\nimport styles from './Snackbar.module.css';\n\nexport type { BasicProps as SnackbarBasicProps };\n\nconst placementClassNames = {\n 'top-start': styles.placementTopStart,\n 'top': styles.placementTop,\n 'top-end': styles.placementTopEnd,\n 'bottom-start': styles.placementBottomStart,\n 'bottom': styles.placementBottom,\n 'bottom-end': styles.placementBottomEnd,\n};\n\nconst animationStateClassNames = {\n enter: styles.stateEnter,\n entering: styles.stateEntering,\n entered: styles.stateEntered,\n exit: styles.stateExit,\n exiting: styles.stateExiting,\n exited: undefined,\n};\n\nexport type SnackbarCloseReason = 'swipe' | 'timeout' | 'click-action' | 'escape-key' | 'manual';\n\nexport interface SnackbarProps\n extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'role'>,\n BasicProps {\n /**\n * Свойства, которые можно прокинуть внутрь компонента:\n * - `root`: свойства для прокидывания в корень компонента;\n * - `action`: свойства для прокидывания в кнопку действия.\n */\n slotProps?:\n | {\n root?:\n | (Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> &\n HasRootRef<HTMLDivElement> &\n HasDataAttribute)\n | undefined;\n action?:\n | (React.HTMLAttributes<HTMLElement> & HasRootRef<HTMLElement> & HasDataAttribute)\n | undefined;\n }\n | undefined;\n /**\n * Задаёт расположение компонента.\n *\n * > Note: в мобильном режиме:\n * > - `\"top-start\"`/`\"top-end\"` перебивается на `\"top\"`, чтобы поведение было схожим с нативными\n * > уведомлениями;\n * > - `\"bottom\"` перебивается на `\"bottom-start\"`, чтобы избежать вызова системных\n * > функций, таких как **Pull To Refresh** и **Режим управления одной рукой**.\n * > - `\"bottom-start\"`/`\"bottom-end\"` закрываются смахиванием в любое из направлений\n * > по горизонтальной оси.\n */\n placement?: SnackbarPlacement | undefined;\n /**\n * Название кнопки действия в уведомлении\n * Не может использоваться одновременно с `subtitle`.\n */\n action?: React.ReactNode | undefined;\n /**\n * Будет вызвано при нажатии на кнопку действия.\n */\n onActionClick?: ((event: React.MouseEvent) => void) | undefined;\n /**\n * Время в миллисекундах, через которое плашка скроется.\n */\n duration?: number | null | undefined;\n /**\n * Обработчик закрытия уведомления.\n */\n onClose?: ((reason: SnackbarCloseReason) => void) | undefined;\n /**\n * Обработчик закрытия уведомления, срабатывающий после окончания анимации.\n */\n onClosed: () => void;\n /**\n * Величина отступа снизу. Используется для позиционирования элемента в случае, когда нежелательно, чтобы Snackbar при появлении перекрывал важные элементы интерфейса.\n */\n offsetY?: React.CSSProperties['bottom'] | undefined;\n /**\n * Для контролируемого управления состоянием открытия снекбара.\n */\n open?: boolean | undefined;\n}\n\n/**\n * @see https://vkui.io/components/snackbar\n */\nexport const Snackbar: React.FC<SnackbarProps> & { Basic: typeof Basic } = ({\n placement = 'bottom-start',\n children,\n layout,\n action,\n before,\n after,\n duration = 4000,\n onActionClick: onActionClickProp,\n onClosed,\n onClose,\n mode = 'default',\n subtitle,\n offsetY,\n getRootRef: getRootRefProp,\n\n slotProps,\n open: openProp,\n id,\n ...restProps\n}: SnackbarProps) => {\n const { getRootRef, ...rootRest } = useMergeProps(\n {\n getRootRef: getRootRefProp,\n ...restProps,\n },\n slotProps?.root,\n );\n\n const { onClick: onActionClick, ...actionRest } = useMergeProps(\n {\n onClick: onActionClickProp,\n },\n slotProps?.action,\n );\n\n const platform = usePlatform();\n const {\n isInsideContainer,\n onOpen,\n onClosed: onClosedFromContext,\n } = useContext(SnackbarsContainerContext);\n\n const [open, setOpen] = React.useState(openProp !== undefined ? openProp : true);\n const [touched, setTouched] = React.useState(false);\n\n const direction = useConfigDirection();\n const isRtl = direction === 'rtl';\n\n const rootRef = useExternRef(getRootRef);\n const focused = useFocusWithin(rootRef);\n const inRef = React.useRef<HTMLDivElement>(null);\n const panGestureRecognizer = React.useRef<UIPanGestureRecognizer | null>(null);\n\n const shiftDataRef = React.useRef<ShiftData | null>(null);\n\n const rafRef = React.useRef<ReturnType<typeof requestAnimationFrame> | null>(null);\n const closeTimeoutIdRef = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const mediaQueries = useMediaQueries();\n const [animationState, animationHandlers] = useCSSKeyframesAnimationController(\n open ? 'enter' : 'exit',\n {\n onEnter: id ? () => onOpen(id) : undefined,\n onExited: callMultiple(onClosed, id ? () => onClosedFromContext(id) : undefined),\n },\n false,\n true,\n );\n\n useIsomorphicLayoutEffect(\n function updateForceOpen() {\n if (openProp !== undefined) {\n if (!openProp) {\n onClose?.('manual');\n }\n setOpen(openProp);\n }\n },\n [openProp],\n );\n\n const clearRAF = React.useCallback(() => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n }, []);\n\n const updateShiftAxisCSSProperties = React.useCallback(\n (x: number | null, y: number | null, direction: number | null) => {\n rafRef.current = requestAnimationFrame(() => {\n if (rootRef.current) {\n x === null\n ? rootRef.current.style.removeProperty('--vkui_internal--snackbar_shift_x')\n : rootRef.current.style.setProperty('--vkui_internal--snackbar_shift_x', `${x}px`);\n y === null\n ? rootRef.current.style.removeProperty('--vkui_internal--snackbar_shift_y')\n : rootRef.current.style.setProperty('--vkui_internal--snackbar_shift_y', `${y}px`);\n direction === null\n ? rootRef.current.style.removeProperty('--vkui_internal--snackbar_direction')\n : /* istanbul ignore next: TODO чтобы протестировать кейс, нужно мокать useMediaQueries(), чтобы перебивать mediaQueries.smallTabletPlus.matches */\n rootRef.current.style.setProperty(\n '--vkui_internal--snackbar_direction',\n `${direction}`,\n );\n }\n });\n },\n [rootRef],\n );\n\n const close = React.useCallback(\n (reason: SnackbarCloseReason) => {\n onClose?.(reason);\n if (openProp === undefined) {\n setOpen(false);\n }\n },\n [onClose, openProp],\n );\n\n const handleActionClick = (event: React.MouseEvent) => {\n close('click-action');\n if (action) {\n onActionClick?.(event as React.MouseEvent<HTMLElement>);\n }\n };\n\n const handleTouchStart = (event: React.UIEvent<HTMLDivElement>) => {\n panGestureRecognizer.current = new UIPanGestureRecognizer();\n panGestureRecognizer.current.setStartCoords(event.nativeEvent);\n shiftDataRef.current = getInitialShiftData(\n rootRef.current!.offsetWidth,\n rootRef.current!.offsetHeight,\n mediaQueries,\n );\n setTouched(true);\n };\n\n const handleTouchMove = (event: React.UIEvent<HTMLDivElement>) => {\n if (shiftDataRef.current && panGestureRecognizer.current) {\n panGestureRecognizer.current.setInitialTimeOnce();\n panGestureRecognizer.current.setEndCoords(event.nativeEvent);\n shiftDataRef.current = getMovedShiftData(\n placement,\n shiftDataRef.current,\n panGestureRecognizer.current.delta(),\n isRtl,\n );\n\n if (shiftDataRef.current.shifted) {\n updateShiftAxisCSSProperties(\n shiftDataRef.current.x,\n shiftDataRef.current.y,\n shiftDataRef.current.direction,\n );\n }\n }\n };\n\n const handleTouchEnd = () => {\n if (\n touched &&\n shiftDataRef.current &&\n panGestureRecognizer.current &&\n shouldBeClosedByShiftData(\n placement,\n shiftDataRef.current,\n getRelativeBoundingClientRect(rootRef.current!, inRef.current!),\n panGestureRecognizer.current.velocity(),\n isRtl,\n )\n ) {\n close('swipe');\n }\n\n setTouched(false);\n };\n\n useIsomorphicLayoutEffect(\n function closeAfterDelay() {\n if (!open || focused || touched || animationState !== 'entered' || !duration) {\n return;\n }\n const onTimeout = () => close('timeout');\n\n closeTimeoutIdRef.current = setTimeout(onTimeout, duration);\n return function preventCloseAfterDelayOnUnmount() {\n clearTimeout(closeTimeoutIdRef.current);\n };\n },\n [open, focused, touched, animationState, close, duration],\n );\n\n useIsomorphicLayoutEffect(\n function clearUserInteractionDataAfterTouchEnd() {\n if (!touched) {\n clearRAF();\n shiftDataRef.current = null;\n panGestureRecognizer.current = null;\n\n if (open) {\n updateShiftAxisCSSProperties(null, null, null);\n }\n }\n },\n [touched, open, updateShiftAxisCSSProperties, clearRAF],\n );\n\n React.useEffect(() => clearRAF, [clearRAF]);\n\n const onEscKeyDown = React.useCallback(() => close('escape-key'), [close]);\n\n useGlobalEscKeyDown(open, onEscKeyDown);\n\n if (animationState === 'exited') {\n return null;\n }\n\n return (\n <RootComponent\n id={id}\n role=\"presentation\"\n baseClassName={classNames(\n styles.host,\n !isInsideContainer && styles.fixed,\n platform === 'ios' && styles.ios,\n touched && styles.touched,\n placementClassNames[placement],\n animationStateClassNames[animationState],\n isRtl && styles.rtl,\n )}\n baseStyle={resolveOffsetYCssStyle(placement, offsetY)}\n getRootRef={rootRef}\n {...rootRest}\n >\n <div\n role=\"alert\"\n className={styles.in}\n ref={inRef}\n // mobile\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n // desktop\n onMouseDown={handleTouchStart}\n onMouseMove={handleTouchMove}\n onMouseUp={handleTouchEnd}\n onMouseLeave={handleTouchEnd}\n {...animationHandlers}\n >\n <Basic\n mode={mode}\n layout={layout}\n before={before}\n after={after}\n subtitle={subtitle}\n action={\n action && (\n <Button\n align=\"left\"\n mode=\"link\"\n appearance={\n mode === 'dark'\n ? /* istanbul ignore next: проверяется в e2e */\n 'overlay'\n : 'accent'\n }\n size=\"s\"\n onClick={handleActionClick}\n {...actionRest}\n >\n {action}\n </Button>\n )\n }\n >\n {children}\n </Basic>\n </div>\n </RootComponent>\n );\n};\n\nSnackbar.Basic = Basic;\n"],"names":["useContext","React","classNames","useConfigDirection","useExternRef","useFocusWithin","useGlobalEscKeyDown","useMediaQueries","useMergeProps","usePlatform","SnackbarsContainerContext","useCSSKeyframesAnimationController","callMultiple","getRelativeBoundingClientRect","UIPanGestureRecognizer","useIsomorphicLayoutEffect","Button","RootComponent","Basic","getInitialShiftData","getMovedShiftData","resolveOffsetYCssStyle","shouldBeClosedByShiftData","styles","placementClassNames","placementTopStart","placementTop","placementTopEnd","placementBottomStart","placementBottom","placementBottomEnd","animationStateClassNames","enter","stateEnter","entering","stateEntering","entered","stateEntered","exit","stateExit","exiting","stateExiting","exited","undefined","Snackbar","placement","children","layout","action","before","after","duration","onActionClick","onActionClickProp","onClosed","onClose","mode","subtitle","offsetY","getRootRef","getRootRefProp","slotProps","open","openProp","id","restProps","rootRest","root","onClick","actionRest","platform","isInsideContainer","onOpen","onClosedFromContext","setOpen","useState","touched","setTouched","direction","isRtl","rootRef","focused","inRef","useRef","panGestureRecognizer","shiftDataRef","rafRef","closeTimeoutIdRef","mediaQueries","animationState","animationHandlers","onEnter","onExited","updateForceOpen","clearRAF","useCallback","current","cancelAnimationFrame","updateShiftAxisCSSProperties","x","y","requestAnimationFrame","style","removeProperty","setProperty","close","reason","handleActionClick","event","handleTouchStart","setStartCoords","nativeEvent","offsetWidth","offsetHeight","handleTouchMove","setInitialTimeOnce","setEndCoords","delta","shifted","handleTouchEnd","velocity","closeAfterDelay","onTimeout","setTimeout","preventCloseAfterDelayOnUnmount","clearTimeout","clearUserInteractionDataAfterTouchEnd","useEffect","onEscKeyDown","role","baseClassName","host","fixed","ios","rtl","baseStyle","div","className","in","ref","onTouchStart","onTouchMove","onTouchEnd","onMouseDown","onMouseMove","onMouseUp","onMouseLeave","align","appearance","size"],"mappings":"AAAA;;AAEA,SAASA,UAAU,QAAQ,QAAQ;AACnC,YAAYC,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,kBAAkB,QAAQ,oCAAiC;AACpE,SAASC,YAAY,QAAQ,8BAA2B;AACxD,SAASC,cAAc,QAAQ,gCAA6B;AAC5D,SAASC,mBAAmB,QAAQ,qCAAkC;AACtE,SAASC,eAAe,QAAQ,iCAA8B;AAC9D,SAASC,aAAa,QAAQ,+BAA4B;AAC1D,SAASC,WAAW,QAAQ,6BAA0B;AACtD,SAASC,yBAAyB,QAAQ,yEAAsE;AAChH,SAASC,kCAAkC,QAAQ,+BAAsB;AACzE,SAASC,YAAY,QAAQ,4BAAyB;AACtD,SAASC,6BAA6B,QAAQ,mBAAgB;AAC9D,SAASC,sBAAsB,QAAQ,2BAAkB;AACzD,SAASC,yBAAyB,QAAQ,yCAAsC;AAEhF,SAASC,MAAM,QAAQ,sBAAmB;AAC1C,SAASC,aAAa,QAAQ,oCAAiC;AAC/D,SAASC,KAAK,QAAyB,iCAA8B;AAErE,SACEC,mBAAmB,EACnBC,iBAAiB,EACjBC,sBAAsB,EACtBC,yBAAyB,QACpB,aAAU;AACjB,OAAOC,YAAY,wBAAwB;AAI3C,MAAMC,sBAAsB;IAC1B,aAAaD,OAAOE,iBAAiB;IACrC,OAAOF,OAAOG,YAAY;IAC1B,WAAWH,OAAOI,eAAe;IACjC,gBAAgBJ,OAAOK,oBAAoB;IAC3C,UAAUL,OAAOM,eAAe;IAChC,cAAcN,OAAOO,kBAAkB;AACzC;AAEA,MAAMC,2BAA2B;IAC/BC,OAAOT,OAAOU,UAAU;IACxBC,UAAUX,OAAOY,aAAa;IAC9BC,SAASb,OAAOc,YAAY;IAC5BC,MAAMf,OAAOgB,SAAS;IACtBC,SAASjB,OAAOkB,YAAY;IAC5BC,QAAQC;AACV;AAmEA;;CAEC,GACD,OAAO,MAAMC,WAA8D,CAAC,EAC1EC,YAAY,cAAc,EAC1BC,QAAQ,EACRC,MAAM,EACNC,MAAM,EACNC,MAAM,EACNC,KAAK,EACLC,WAAW,IAAI,EACfC,eAAeC,iBAAiB,EAChCC,QAAQ,EACRC,OAAO,EACPC,OAAO,SAAS,EAChBC,QAAQ,EACRC,OAAO,EACPC,YAAYC,cAAc,EAE1BC,SAAS,EACTC,MAAMC,QAAQ,EACdC,EAAE,EACF,GAAGC,WACW;IACd,MAAM,EAAEN,UAAU,EAAE,GAAGO,UAAU,GAAG1D,cAClC;QACEmD,YAAYC;QACZ,GAAGK,SAAS;IACd,GACAJ,WAAWM;IAGb,MAAM,EAAEC,SAAShB,aAAa,EAAE,GAAGiB,YAAY,GAAG7D,cAChD;QACE4D,SAASf;IACX,GACAQ,WAAWb;IAGb,MAAMsB,WAAW7D;IACjB,MAAM,EACJ8D,iBAAiB,EACjBC,MAAM,EACNlB,UAAUmB,mBAAmB,EAC9B,GAAGzE,WAAWU;IAEf,MAAM,CAACoD,MAAMY,QAAQ,GAAGzE,MAAM0E,QAAQ,CAACZ,aAAapB,YAAYoB,WAAW;IAC3E,MAAM,CAACa,SAASC,WAAW,GAAG5E,MAAM0E,QAAQ,CAAC;IAE7C,MAAMG,YAAY3E;IAClB,MAAM4E,QAAQD,cAAc;IAE5B,MAAME,UAAU5E,aAAauD;IAC7B,MAAMsB,UAAU5E,eAAe2E;IAC/B,MAAME,QAAQjF,MAAMkF,MAAM,CAAiB;IAC3C,MAAMC,uBAAuBnF,MAAMkF,MAAM,CAAgC;IAEzE,MAAME,eAAepF,MAAMkF,MAAM,CAAmB;IAEpD,MAAMG,SAASrF,MAAMkF,MAAM,CAAkD;IAC7E,MAAMI,oBAAoBtF,MAAMkF,MAAM,CAA4CxC;IAClF,MAAM6C,eAAejF;IACrB,MAAM,CAACkF,gBAAgBC,kBAAkB,GAAG/E,mCAC1CmD,OAAO,UAAU,QACjB;QACE6B,SAAS3B,KAAK,IAAMQ,OAAOR,MAAMrB;QACjCiD,UAAUhF,aAAa0C,UAAUU,KAAK,IAAMS,oBAAoBT,MAAMrB;IACxE,GACA,OACA;IAGF5B,0BACE,SAAS8E;QACP,IAAI9B,aAAapB,WAAW;YAC1B,IAAI,CAACoB,UAAU;gBACbR,UAAU;YACZ;YACAmB,QAAQX;QACV;IACF,GACA;QAACA;KAAS;IAGZ,MAAM+B,WAAW7F,MAAM8F,WAAW,CAAC;QACjC,IAAIT,OAAOU,OAAO,KAAK,MAAM;YAC3BC,qBAAqBX,OAAOU,OAAO;YACnCV,OAAOU,OAAO,GAAG;QACnB;IACF,GAAG,EAAE;IAEL,MAAME,+BAA+BjG,MAAM8F,WAAW,CACpD,CAACI,GAAkBC,GAAkBtB;QACnCQ,OAAOU,OAAO,GAAGK,sBAAsB;YACrC,IAAIrB,QAAQgB,OAAO,EAAE;gBACnBG,MAAM,OACFnB,QAAQgB,OAAO,CAACM,KAAK,CAACC,cAAc,CAAC,uCACrCvB,QAAQgB,OAAO,CAACM,KAAK,CAACE,WAAW,CAAC,qCAAqC,GAAGL,EAAE,EAAE,CAAC;gBACnFC,MAAM,OACFpB,QAAQgB,OAAO,CAACM,KAAK,CAACC,cAAc,CAAC,uCACrCvB,QAAQgB,OAAO,CAACM,KAAK,CAACE,WAAW,CAAC,qCAAqC,GAAGJ,EAAE,EAAE,CAAC;gBACnFtB,cAAc,OACVE,QAAQgB,OAAO,CAACM,KAAK,CAACC,cAAc,CAAC,yCACrC,+IAA+I,GAC/IvB,QAAQgB,OAAO,CAACM,KAAK,CAACE,WAAW,CAC/B,uCACA,GAAG1B,WAAW;YAEtB;QACF;IACF,GACA;QAACE;KAAQ;IAGX,MAAMyB,QAAQxG,MAAM8F,WAAW,CAC7B,CAACW;QACCnD,UAAUmD;QACV,IAAI3C,aAAapB,WAAW;YAC1B+B,QAAQ;QACV;IACF,GACA;QAACnB;QAASQ;KAAS;IAGrB,MAAM4C,oBAAoB,CAACC;QACzBH,MAAM;QACN,IAAIzD,QAAQ;YACVI,gBAAgBwD;QAClB;IACF;IAEA,MAAMC,mBAAmB,CAACD;QACxBxB,qBAAqBY,OAAO,GAAG,IAAIlF;QACnCsE,qBAAqBY,OAAO,CAACc,cAAc,CAACF,MAAMG,WAAW;QAC7D1B,aAAaW,OAAO,GAAG7E,oBACrB6D,QAAQgB,OAAO,CAAEgB,WAAW,EAC5BhC,QAAQgB,OAAO,CAAEiB,YAAY,EAC7BzB;QAEFX,WAAW;IACb;IAEA,MAAMqC,kBAAkB,CAACN;QACvB,IAAIvB,aAAaW,OAAO,IAAIZ,qBAAqBY,OAAO,EAAE;YACxDZ,qBAAqBY,OAAO,CAACmB,kBAAkB;YAC/C/B,qBAAqBY,OAAO,CAACoB,YAAY,CAACR,MAAMG,WAAW;YAC3D1B,aAAaW,OAAO,GAAG5E,kBACrByB,WACAwC,aAAaW,OAAO,EACpBZ,qBAAqBY,OAAO,CAACqB,KAAK,IAClCtC;YAGF,IAAIM,aAAaW,OAAO,CAACsB,OAAO,EAAE;gBAChCpB,6BACEb,aAAaW,OAAO,CAACG,CAAC,EACtBd,aAAaW,OAAO,CAACI,CAAC,EACtBf,aAAaW,OAAO,CAAClB,SAAS;YAElC;QACF;IACF;IAEA,MAAMyC,iBAAiB;QACrB,IACE3C,WACAS,aAAaW,OAAO,IACpBZ,qBAAqBY,OAAO,IAC5B1E,0BACEuB,WACAwC,aAAaW,OAAO,EACpBnF,8BAA8BmE,QAAQgB,OAAO,EAAGd,MAAMc,OAAO,GAC7DZ,qBAAqBY,OAAO,CAACwB,QAAQ,IACrCzC,QAEF;YACA0B,MAAM;QACR;QAEA5B,WAAW;IACb;IAEA9D,0BACE,SAAS0G;QACP,IAAI,CAAC3D,QAAQmB,WAAWL,WAAWa,mBAAmB,aAAa,CAACtC,UAAU;YAC5E;QACF;QACA,MAAMuE,YAAY,IAAMjB,MAAM;QAE9BlB,kBAAkBS,OAAO,GAAG2B,WAAWD,WAAWvE;QAClD,OAAO,SAASyE;YACdC,aAAatC,kBAAkBS,OAAO;QACxC;IACF,GACA;QAAClC;QAAMmB;QAASL;QAASa;QAAgBgB;QAAOtD;KAAS;IAG3DpC,0BACE,SAAS+G;QACP,IAAI,CAAClD,SAAS;YACZkB;YACAT,aAAaW,OAAO,GAAG;YACvBZ,qBAAqBY,OAAO,GAAG;YAE/B,IAAIlC,MAAM;gBACRoC,6BAA6B,MAAM,MAAM;YAC3C;QACF;IACF,GACA;QAACtB;QAASd;QAAMoC;QAA8BJ;KAAS;IAGzD7F,MAAM8H,SAAS,CAAC,IAAMjC,UAAU;QAACA;KAAS;IAE1C,MAAMkC,eAAe/H,MAAM8F,WAAW,CAAC,IAAMU,MAAM,eAAe;QAACA;KAAM;IAEzEnG,oBAAoBwD,MAAMkE;IAE1B,IAAIvC,mBAAmB,UAAU;QAC/B,OAAO;IACT;IAEA,qBACE,KAACxE;QACC+C,IAAIA;QACJiE,MAAK;QACLC,eAAehI,WACbqB,OAAO4G,IAAI,EACX,CAAC5D,qBAAqBhD,OAAO6G,KAAK,EAClC9D,aAAa,SAAS/C,OAAO8G,GAAG,EAChCzD,WAAWrD,OAAOqD,OAAO,EACzBpD,mBAAmB,CAACqB,UAAU,EAC9Bd,wBAAwB,CAAC0D,eAAe,EACxCV,SAASxD,OAAO+G,GAAG;QAErBC,WAAWlH,uBAAuBwB,WAAWa;QAC7CC,YAAYqB;QACX,GAAGd,QAAQ;kBAEZ,cAAA,KAACsE;YACCP,MAAK;YACLQ,WAAWlH,OAAOmH,EAAE;YACpBC,KAAKzD;YACL,SAAS;YACT0D,cAAc/B;YACdgC,aAAa3B;YACb4B,YAAYvB;YACZ,UAAU;YACVwB,aAAalC;YACbmC,aAAa9B;YACb+B,WAAW1B;YACX2B,cAAc3B;YACb,GAAG7B,iBAAiB;sBAErB,cAAA,KAACxE;gBACCsC,MAAMA;gBACNT,QAAQA;gBACRE,QAAQA;gBACRC,OAAOA;gBACPO,UAAUA;gBACVT,QACEA,wBACE,KAAChC;oBACCmI,OAAM;oBACN3F,MAAK;oBACL4F,YACE5F,SAAS,SACL,2CAA2C,GAC3C,YACA;oBAEN6F,MAAK;oBACLjF,SAASuC;oBACR,GAAGtC,UAAU;8BAEbrB;;0BAKNF;;;;AAKX,EAAE;AAEFF,SAAS1B,KAAK,GAAGA"}
1
+ {"version":3,"sources":["../../../../src/components/Snackbar/Snackbar.tsx"],"sourcesContent":["'use client';\n\nimport { useContext } from 'react';\nimport * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { useConfigDirection } from '../../hooks/useConfigDirection';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useFocusWithin } from '../../hooks/useFocusWithin';\nimport { useGlobalEscKeyDown } from '../../hooks/useGlobalEscKeyDown';\nimport { useMediaQueries } from '../../hooks/useMediaQueries';\nimport { useMergeProps } from '../../hooks/useMergeProps';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { SnackbarsContainerContext } from '../../hooks/useSnackbarManager/components/SnackbarsContainerContext';\nimport { useStableCallback } from '../../hooks/useStableCallback';\nimport { useCSSKeyframesAnimationController } from '../../lib/animation';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { getRelativeBoundingClientRect } from '../../lib/dom';\nimport { UIPanGestureRecognizer } from '../../lib/touch';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport type { HasDataAttribute, HasRootRef, HTMLAttributesWithRootRef } from '../../types';\nimport { Button } from '../Button/Button';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport { Basic, type BasicProps } from './subcomponents/Basic/Basic';\nimport type { ShiftData, SnackbarPlacement } from './types';\nimport {\n getInitialShiftData,\n getMovedShiftData,\n resolveOffsetYCssStyle,\n shouldBeClosedByShiftData,\n} from './utils';\nimport styles from './Snackbar.module.css';\n\nexport type { BasicProps as SnackbarBasicProps };\n\nconst placementClassNames = {\n 'top-start': styles.placementTopStart,\n 'top': styles.placementTop,\n 'top-end': styles.placementTopEnd,\n 'bottom-start': styles.placementBottomStart,\n 'bottom': styles.placementBottom,\n 'bottom-end': styles.placementBottomEnd,\n};\n\nconst animationStateClassNames = {\n enter: styles.stateEnter,\n entering: styles.stateEntering,\n entered: styles.stateEntered,\n exit: styles.stateExit,\n exiting: styles.stateExiting,\n exited: undefined,\n};\n\nexport type SnackbarCloseReason = 'swipe' | 'timeout' | 'click-action' | 'escape-key' | 'manual';\n\nexport interface SnackbarProps\n extends Omit<HTMLAttributesWithRootRef<HTMLDivElement>, 'role'>,\n BasicProps {\n /**\n * Свойства, которые можно прокинуть внутрь компонента:\n * - `root`: свойства для прокидывания в корень компонента;\n * - `action`: свойства для прокидывания в кнопку действия.\n */\n slotProps?:\n | {\n root?:\n | (Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> &\n HasRootRef<HTMLDivElement> &\n HasDataAttribute)\n | undefined;\n action?:\n | (React.HTMLAttributes<HTMLElement> & HasRootRef<HTMLElement> & HasDataAttribute)\n | undefined;\n }\n | undefined;\n /**\n * Задаёт расположение компонента.\n *\n * > Note: в мобильном режиме:\n * > - `\"top-start\"`/`\"top-end\"` перебивается на `\"top\"`, чтобы поведение было схожим с нативными\n * > уведомлениями;\n * > - `\"bottom\"` перебивается на `\"bottom-start\"`, чтобы избежать вызова системных\n * > функций, таких как **Pull To Refresh** и **Режим управления одной рукой**.\n * > - `\"bottom-start\"`/`\"bottom-end\"` закрываются смахиванием в любое из направлений\n * > по горизонтальной оси.\n */\n placement?: SnackbarPlacement | undefined;\n /**\n * Название кнопки действия в уведомлении\n * Не может использоваться одновременно с `subtitle`.\n */\n action?: React.ReactNode | undefined;\n /**\n * Будет вызвано при нажатии на кнопку действия.\n */\n onActionClick?: ((event: React.MouseEvent) => void) | undefined;\n /**\n * Время в миллисекундах, через которое плашка скроется.\n */\n duration?: number | null | undefined;\n /**\n * Обработчик закрытия уведомления.\n */\n onClose?: ((reason: SnackbarCloseReason) => void) | undefined;\n /**\n * Обработчик закрытия уведомления, срабатывающий после окончания анимации.\n */\n onClosed: () => void;\n /**\n * Величина отступа снизу. Используется для позиционирования элемента в случае, когда нежелательно, чтобы Snackbar при появлении перекрывал важные элементы интерфейса.\n */\n offsetY?: React.CSSProperties['bottom'] | undefined;\n /**\n * Для контролируемого управления состоянием открытия снекбара.\n */\n open?: boolean | undefined;\n}\n\n/**\n * @see https://vkui.io/components/snackbar\n */\nexport const Snackbar: React.FC<SnackbarProps> & { Basic: typeof Basic } = ({\n placement = 'bottom-start',\n children,\n layout,\n action,\n before,\n after,\n duration = 4000,\n onActionClick: onActionClickProp,\n onClosed,\n onClose: onCloseProp,\n mode = 'default',\n subtitle,\n offsetY,\n getRootRef: getRootRefProp,\n\n slotProps,\n open: openProp,\n id,\n ...restProps\n}: SnackbarProps) => {\n const { getRootRef, ...rootRest } = useMergeProps(\n {\n getRootRef: getRootRefProp,\n ...restProps,\n },\n slotProps?.root,\n );\n\n const { onClick: onActionClick, ...actionRest } = useMergeProps(\n {\n onClick: onActionClickProp,\n },\n slotProps?.action,\n );\n\n const onClose = useStableCallback(onCloseProp || noop);\n\n const platform = usePlatform();\n const {\n isInsideContainer,\n onOpen,\n onClosed: onClosedFromContext,\n } = useContext(SnackbarsContainerContext);\n\n const [open, setOpen] = React.useState(openProp !== undefined ? openProp : true);\n const [touched, setTouched] = React.useState(false);\n\n const direction = useConfigDirection();\n const isRtl = direction === 'rtl';\n\n const rootRef = useExternRef(getRootRef);\n const focused = useFocusWithin(rootRef);\n const inRef = React.useRef<HTMLDivElement>(null);\n const panGestureRecognizer = React.useRef<UIPanGestureRecognizer | null>(null);\n\n const shiftDataRef = React.useRef<ShiftData | null>(null);\n\n const rafRef = React.useRef<ReturnType<typeof requestAnimationFrame> | null>(null);\n const closeTimeoutIdRef = React.useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const mediaQueries = useMediaQueries();\n const [animationState, animationHandlers] = useCSSKeyframesAnimationController(\n open ? 'enter' : 'exit',\n {\n onEnter: id ? () => onOpen(id) : undefined,\n onExited: callMultiple(onClosed, id ? () => onClosedFromContext(id) : undefined),\n },\n false,\n true,\n );\n\n useIsomorphicLayoutEffect(\n function updateForceOpen() {\n if (openProp !== undefined) {\n if (!openProp) {\n onClose?.('manual');\n }\n setOpen(openProp);\n }\n },\n [openProp, onClose],\n );\n\n const clearRAF = React.useCallback(() => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n }, []);\n\n const updateShiftAxisCSSProperties = React.useCallback(\n (x: number | null, y: number | null, direction: number | null) => {\n rafRef.current = requestAnimationFrame(() => {\n if (rootRef.current) {\n x === null\n ? rootRef.current.style.removeProperty('--vkui_internal--snackbar_shift_x')\n : rootRef.current.style.setProperty('--vkui_internal--snackbar_shift_x', `${x}px`);\n y === null\n ? rootRef.current.style.removeProperty('--vkui_internal--snackbar_shift_y')\n : rootRef.current.style.setProperty('--vkui_internal--snackbar_shift_y', `${y}px`);\n direction === null\n ? rootRef.current.style.removeProperty('--vkui_internal--snackbar_direction')\n : /* istanbul ignore next: TODO чтобы протестировать кейс, нужно мокать useMediaQueries(), чтобы перебивать mediaQueries.smallTabletPlus.matches */\n rootRef.current.style.setProperty(\n '--vkui_internal--snackbar_direction',\n `${direction}`,\n );\n }\n });\n },\n [rootRef],\n );\n\n const close = React.useCallback(\n (reason: SnackbarCloseReason) => {\n onClose?.(reason);\n if (openProp === undefined) {\n setOpen(false);\n }\n },\n [onClose, openProp],\n );\n\n const handleActionClick = (event: React.MouseEvent) => {\n close('click-action');\n if (action) {\n onActionClick?.(event as React.MouseEvent<HTMLElement>);\n }\n };\n\n const handleTouchStart = (event: React.UIEvent<HTMLDivElement>) => {\n panGestureRecognizer.current = new UIPanGestureRecognizer();\n panGestureRecognizer.current.setStartCoords(event.nativeEvent);\n shiftDataRef.current = getInitialShiftData(\n rootRef.current!.offsetWidth,\n rootRef.current!.offsetHeight,\n mediaQueries,\n );\n setTouched(true);\n };\n\n const handleTouchMove = (event: React.UIEvent<HTMLDivElement>) => {\n if (shiftDataRef.current && panGestureRecognizer.current) {\n panGestureRecognizer.current.setInitialTimeOnce();\n panGestureRecognizer.current.setEndCoords(event.nativeEvent);\n shiftDataRef.current = getMovedShiftData(\n placement,\n shiftDataRef.current,\n panGestureRecognizer.current.delta(),\n isRtl,\n );\n\n if (shiftDataRef.current.shifted) {\n updateShiftAxisCSSProperties(\n shiftDataRef.current.x,\n shiftDataRef.current.y,\n shiftDataRef.current.direction,\n );\n }\n }\n };\n\n const handleTouchEnd = () => {\n if (\n touched &&\n shiftDataRef.current &&\n panGestureRecognizer.current &&\n shouldBeClosedByShiftData(\n placement,\n shiftDataRef.current,\n getRelativeBoundingClientRect(rootRef.current!, inRef.current!),\n panGestureRecognizer.current.velocity(),\n isRtl,\n )\n ) {\n close('swipe');\n }\n\n setTouched(false);\n };\n\n useIsomorphicLayoutEffect(\n function closeAfterDelay() {\n if (!open || focused || touched || animationState !== 'entered' || !duration) {\n return;\n }\n const onTimeout = () => close('timeout');\n\n closeTimeoutIdRef.current = setTimeout(onTimeout, duration);\n return function preventCloseAfterDelayOnUnmount() {\n clearTimeout(closeTimeoutIdRef.current);\n };\n },\n [open, focused, touched, animationState, close, duration],\n );\n\n useIsomorphicLayoutEffect(\n function clearUserInteractionDataAfterTouchEnd() {\n if (!touched) {\n clearRAF();\n shiftDataRef.current = null;\n panGestureRecognizer.current = null;\n\n if (open) {\n updateShiftAxisCSSProperties(null, null, null);\n }\n }\n },\n [touched, open, updateShiftAxisCSSProperties, clearRAF],\n );\n\n React.useEffect(() => clearRAF, [clearRAF]);\n\n const onEscKeyDown = React.useCallback(() => close('escape-key'), [close]);\n\n useGlobalEscKeyDown(open, onEscKeyDown);\n\n if (animationState === 'exited') {\n return null;\n }\n\n return (\n <RootComponent\n id={id}\n role=\"presentation\"\n baseClassName={classNames(\n styles.host,\n !isInsideContainer && styles.fixed,\n platform === 'ios' && styles.ios,\n touched && styles.touched,\n placementClassNames[placement],\n animationStateClassNames[animationState],\n isRtl && styles.rtl,\n )}\n baseStyle={resolveOffsetYCssStyle(placement, offsetY)}\n getRootRef={rootRef}\n {...rootRest}\n >\n <div\n role=\"alert\"\n className={styles.in}\n ref={inRef}\n // mobile\n onTouchStart={handleTouchStart}\n onTouchMove={handleTouchMove}\n onTouchEnd={handleTouchEnd}\n // desktop\n onMouseDown={handleTouchStart}\n onMouseMove={handleTouchMove}\n onMouseUp={handleTouchEnd}\n onMouseLeave={handleTouchEnd}\n {...animationHandlers}\n >\n <Basic\n mode={mode}\n layout={layout}\n before={before}\n after={after}\n subtitle={subtitle}\n action={\n action && (\n <Button\n align=\"left\"\n mode=\"link\"\n appearance={\n mode === 'dark'\n ? /* istanbul ignore next: проверяется в e2e */\n 'overlay'\n : 'accent'\n }\n size=\"s\"\n onClick={handleActionClick}\n {...actionRest}\n >\n {action}\n </Button>\n )\n }\n >\n {children}\n </Basic>\n </div>\n </RootComponent>\n );\n};\n\nSnackbar.Basic = Basic;\n"],"names":["useContext","React","classNames","noop","useConfigDirection","useExternRef","useFocusWithin","useGlobalEscKeyDown","useMediaQueries","useMergeProps","usePlatform","SnackbarsContainerContext","useStableCallback","useCSSKeyframesAnimationController","callMultiple","getRelativeBoundingClientRect","UIPanGestureRecognizer","useIsomorphicLayoutEffect","Button","RootComponent","Basic","getInitialShiftData","getMovedShiftData","resolveOffsetYCssStyle","shouldBeClosedByShiftData","styles","placementClassNames","placementTopStart","placementTop","placementTopEnd","placementBottomStart","placementBottom","placementBottomEnd","animationStateClassNames","enter","stateEnter","entering","stateEntering","entered","stateEntered","exit","stateExit","exiting","stateExiting","exited","undefined","Snackbar","placement","children","layout","action","before","after","duration","onActionClick","onActionClickProp","onClosed","onClose","onCloseProp","mode","subtitle","offsetY","getRootRef","getRootRefProp","slotProps","open","openProp","id","restProps","rootRest","root","onClick","actionRest","platform","isInsideContainer","onOpen","onClosedFromContext","setOpen","useState","touched","setTouched","direction","isRtl","rootRef","focused","inRef","useRef","panGestureRecognizer","shiftDataRef","rafRef","closeTimeoutIdRef","mediaQueries","animationState","animationHandlers","onEnter","onExited","updateForceOpen","clearRAF","useCallback","current","cancelAnimationFrame","updateShiftAxisCSSProperties","x","y","requestAnimationFrame","style","removeProperty","setProperty","close","reason","handleActionClick","event","handleTouchStart","setStartCoords","nativeEvent","offsetWidth","offsetHeight","handleTouchMove","setInitialTimeOnce","setEndCoords","delta","shifted","handleTouchEnd","velocity","closeAfterDelay","onTimeout","setTimeout","preventCloseAfterDelayOnUnmount","clearTimeout","clearUserInteractionDataAfterTouchEnd","useEffect","onEscKeyDown","role","baseClassName","host","fixed","ios","rtl","baseStyle","div","className","in","ref","onTouchStart","onTouchMove","onTouchEnd","onMouseDown","onMouseMove","onMouseUp","onMouseLeave","align","appearance","size"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Spacing/Spacing.tsx"],"sourcesContent":["import type * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { resolveSpacingSize, type SpacingSizeProp } from '../../lib/spacings/sizes';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './Spacing.module.css';\n\nexport const CUSTOM_CSS_TOKEN_FOR_USER_GAP = '--vkui_internal--spacing_size';\n\nexport interface SpacingProps extends HTMLAttributesWithRootRef<HTMLDivElement> {\n /**\n * Высота спэйсинга.\n *\n * Принимает значения дизайн-системы, числовые значения и css-переменные.\n */\n size?: SpacingSizeProp | undefined;\n /**\n * @deprecated 7.0.0.Будет удалeно в **VKUI v9**.\n */\n children?: React.ReactNode | undefined; // TODO [>=9]: удалить неиспользуемое свойство\n}\n/**\n * @see https://vkui.io/components/spacing\n */\nexport const Spacing = ({ size = 'm', ...restProps }: SpacingProps): React.ReactNode => {\n const [spacingSizeClassName, spacingSizeStyle] = resolveSpacingSize(\n CUSTOM_CSS_TOKEN_FOR_USER_GAP,\n size,\n );\n return (\n <RootComponent\n {...restProps}\n baseStyle={spacingSizeStyle}\n baseClassName={classNames(styles.host, spacingSizeClassName)}\n />\n );\n};\n"],"names":["classNames","resolveSpacingSize","RootComponent","styles","CUSTOM_CSS_TOKEN_FOR_USER_GAP","Spacing","size","restProps","spacingSizeClassName","spacingSizeStyle","baseStyle","baseClassName","host"],"mappings":";AACA,SAASA,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,kBAAkB,QAA8B,8BAA2B;AAEpF,SAASC,aAAa,QAAQ,oCAAiC;AAC/D,OAAOC,YAAY,uBAAuB;AAE1C,OAAO,MAAMC,gCAAgC,gCAAgC;AAc7E;;CAEC,GACD,OAAO,MAAMC,UAAU,CAAC,EAAEC,OAAO,GAAG,EAAE,GAAGC,WAAyB;IAChE,MAAM,CAACC,sBAAsBC,iBAAiB,GAAGR,mBAC/CG,+BACAE;IAEF,qBACE,KAACJ;QACE,GAAGK,SAAS;QACbG,WAAWD;QACXE,eAAeX,WAAWG,OAAOS,IAAI,EAAEJ;;AAG7C,EAAE"}
1
+ {"version":3,"sources":["../../../../src/components/Spacing/Spacing.tsx"],"sourcesContent":["import type * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { resolveSpacingSize, type SpacingSizeProp } from '../../lib/spacings/sizes';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './Spacing.module.css';\n\nexport const CUSTOM_CSS_TOKEN_FOR_USER_GAP = '--vkui_internal--spacing_size';\n\nexport interface SpacingProps extends HTMLAttributesWithRootRef<HTMLDivElement> {\n /**\n * Высота спэйсинга.\n *\n * Принимает значения дизайн-системы, числовые значения и css-переменные.\n */\n size?: SpacingSizeProp | undefined;\n /**\n * @deprecated 7.0.0.Будет удалено в **VKUI v9**.\n */\n children?: React.ReactNode | undefined; // TODO [>=9]: удалить неиспользуемое свойство\n}\n/**\n * @see https://vkui.io/components/spacing\n */\nexport const Spacing = ({ size = 'm', ...restProps }: SpacingProps): React.ReactNode => {\n const [spacingSizeClassName, spacingSizeStyle] = resolveSpacingSize(\n CUSTOM_CSS_TOKEN_FOR_USER_GAP,\n size,\n );\n return (\n <RootComponent\n {...restProps}\n baseStyle={spacingSizeStyle}\n baseClassName={classNames(styles.host, spacingSizeClassName)}\n />\n );\n};\n"],"names":["classNames","resolveSpacingSize","RootComponent","styles","CUSTOM_CSS_TOKEN_FOR_USER_GAP","Spacing","size","restProps","spacingSizeClassName","spacingSizeStyle","baseStyle","baseClassName","host"],"mappings":";AACA,SAASA,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,kBAAkB,QAA8B,8BAA2B;AAEpF,SAASC,aAAa,QAAQ,oCAAiC;AAC/D,OAAOC,YAAY,uBAAuB;AAE1C,OAAO,MAAMC,gCAAgC,gCAAgC;AAc7E;;CAEC,GACD,OAAO,MAAMC,UAAU,CAAC,EAAEC,OAAO,GAAG,EAAE,GAAGC,WAAyB;IAChE,MAAM,CAACC,sBAAsBC,iBAAiB,GAAGR,mBAC/CG,+BACAE;IAEF,qBACE,KAACJ;QACE,GAAGK,SAAS;QACbG,WAAWD;QACXE,eAAeX,WAAWG,OAAOS,IAAI,EAAEJ;;AAG7C,EAAE"}
@@ -0,0 +1,56 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { classNames, hasReactNode } from "@vkontakte/vkjs";
4
+ import { usePlatform } from "../../../hooks/usePlatform.js";
5
+ import * as shapes from "../../../lib/material/shapes/shapes.js";
6
+ import { animationVisibilityDelayStyles } from "../../../styles/animationVisibilityDelay.js";
7
+ import { RootComponent } from "../../RootComponent/RootComponent.js";
8
+ import { VisuallyHidden } from "../../VisuallyHidden/VisuallyHidden.js";
9
+ import { Spinner as SimpleSpinner } from "../Spinner.js";
10
+ import { IconMaterial } from "./icons.js";
11
+ import styles from "./ExpressiveSpinner.module.css";
12
+ import stylesDelay from "../../../styles/animationVisibilityDelay.module.css";
13
+ const iconSizeMap = {
14
+ s: 16,
15
+ m: 24,
16
+ l: 32,
17
+ xl: 44
18
+ };
19
+ const defaultShapesList = [
20
+ shapes.softBurstParams,
21
+ shapes.cookie9Params,
22
+ shapes.pentagonParams,
23
+ shapes.pillParams,
24
+ shapes.sunnyParams,
25
+ shapes.cookie4Params,
26
+ shapes.ovalParams
27
+ ];
28
+ function MaterialSpinner({ polygons = defaultShapesList, size = 'm', children = 'Загружается...', disableAnimation = false, noColor = false, visibilityDelay, ...restProps }) {
29
+ const iconSize = iconSizeMap[size];
30
+ return /*#__PURE__*/ _jsxs(RootComponent, {
31
+ Component: "span",
32
+ role: "status",
33
+ ...restProps,
34
+ baseClassName: classNames(styles.host, noColor && styles.noColor, visibilityDelay && stylesDelay.visibilityDelay),
35
+ baseStyle: animationVisibilityDelayStyles(visibilityDelay),
36
+ children: [
37
+ /*#__PURE__*/ _jsx(IconMaterial, {
38
+ size: iconSize,
39
+ polygons: polygons,
40
+ disableAnimation: disableAnimation
41
+ }),
42
+ hasReactNode(children) && /*#__PURE__*/ _jsx(VisuallyHidden, {
43
+ children: children
44
+ })
45
+ ]
46
+ });
47
+ }
48
+ export function ExpressiveSpinner(props) {
49
+ const platform = usePlatform();
50
+ const Component = platform === 'ios' ? SimpleSpinner : MaterialSpinner;
51
+ return /*#__PURE__*/ _jsx(Component, {
52
+ ...props
53
+ });
54
+ }
55
+
56
+ //# sourceMappingURL=ExpressiveSpinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.tsx"],"sourcesContent":["'use client';\n\nimport { classNames, hasReactNode } from '@vkontakte/vkjs';\nimport { usePlatform } from '../../../hooks/usePlatform';\nimport * as shapes from '../../../lib/material/shapes/shapes';\nimport { animationVisibilityDelayStyles } from '../../../styles/animationVisibilityDelay';\nimport { RootComponent } from '../../RootComponent/RootComponent';\nimport { VisuallyHidden } from '../../VisuallyHidden/VisuallyHidden';\nimport { Spinner as SimpleSpinner, type SpinnerProps } from '../Spinner';\nimport { IconMaterial } from './icons';\nimport styles from './ExpressiveSpinner.module.css';\nimport stylesDelay from '../../../styles/animationVisibilityDelay.module.css';\n\nconst iconSizeMap = {\n s: 16,\n m: 24,\n l: 32,\n xl: 44,\n} as const;\n\nconst defaultShapesList = [\n shapes.softBurstParams,\n shapes.cookie9Params,\n shapes.pentagonParams,\n shapes.pillParams,\n shapes.sunnyParams,\n shapes.cookie4Params,\n shapes.ovalParams,\n] as const;\n\nexport interface MaterialSpinnerProps extends SpinnerProps {\n /**\n * Последовательность форм между которыми будет происходить анимация.\n */\n polygons?: readonly [shapes.ShapeParameters, shapes.ShapeParameters, ...shapes.ShapeParameters[]];\n}\n\nfunction MaterialSpinner({\n polygons = defaultShapesList,\n size = 'm',\n children = 'Загружается...',\n disableAnimation = false,\n noColor = false,\n visibilityDelay,\n ...restProps\n}: MaterialSpinnerProps) {\n const iconSize = iconSizeMap[size];\n\n return (\n <RootComponent\n Component=\"span\"\n role=\"status\"\n {...restProps}\n baseClassName={classNames(\n styles.host,\n noColor && styles.noColor,\n visibilityDelay && stylesDelay.visibilityDelay,\n )}\n baseStyle={animationVisibilityDelayStyles(visibilityDelay)}\n >\n <IconMaterial size={iconSize} polygons={polygons} disableAnimation={disableAnimation} />\n {hasReactNode(children) && <VisuallyHidden>{children}</VisuallyHidden>}\n </RootComponent>\n );\n}\n\nexport function ExpressiveSpinner(props: SpinnerProps) {\n const platform = usePlatform();\n\n const Component = platform === 'ios' ? SimpleSpinner : MaterialSpinner;\n\n return <Component {...props} />;\n}\n"],"names":["classNames","hasReactNode","usePlatform","shapes","animationVisibilityDelayStyles","RootComponent","VisuallyHidden","Spinner","SimpleSpinner","IconMaterial","styles","stylesDelay","iconSizeMap","s","m","l","xl","defaultShapesList","softBurstParams","cookie9Params","pentagonParams","pillParams","sunnyParams","cookie4Params","ovalParams","MaterialSpinner","polygons","size","children","disableAnimation","noColor","visibilityDelay","restProps","iconSize","Component","role","baseClassName","host","baseStyle","ExpressiveSpinner","props","platform"],"mappings":"AAAA;;AAEA,SAASA,UAAU,EAAEC,YAAY,QAAQ,kBAAkB;AAC3D,SAASC,WAAW,QAAQ,gCAA6B;AACzD,YAAYC,YAAY,yCAAsC;AAC9D,SAASC,8BAA8B,QAAQ,8CAA2C;AAC1F,SAASC,aAAa,QAAQ,uCAAoC;AAClE,SAASC,cAAc,QAAQ,yCAAsC;AACrE,SAASC,WAAWC,aAAa,QAA2B,gBAAa;AACzE,SAASC,YAAY,QAAQ,aAAU;AACvC,OAAOC,YAAY,iCAAiC;AACpD,OAAOC,iBAAiB,sDAAsD;AAE9E,MAAMC,cAAc;IAClBC,GAAG;IACHC,GAAG;IACHC,GAAG;IACHC,IAAI;AACN;AAEA,MAAMC,oBAAoB;IACxBd,OAAOe,eAAe;IACtBf,OAAOgB,aAAa;IACpBhB,OAAOiB,cAAc;IACrBjB,OAAOkB,UAAU;IACjBlB,OAAOmB,WAAW;IAClBnB,OAAOoB,aAAa;IACpBpB,OAAOqB,UAAU;CAClB;AASD,SAASC,gBAAgB,EACvBC,WAAWT,iBAAiB,EAC5BU,OAAO,GAAG,EACVC,WAAW,gBAAgB,EAC3BC,mBAAmB,KAAK,EACxBC,UAAU,KAAK,EACfC,eAAe,EACf,GAAGC,WACkB;IACrB,MAAMC,WAAWrB,WAAW,CAACe,KAAK;IAElC,qBACE,MAACtB;QACC6B,WAAU;QACVC,MAAK;QACJ,GAAGH,SAAS;QACbI,eAAepC,WACbU,OAAO2B,IAAI,EACXP,WAAWpB,OAAOoB,OAAO,EACzBC,mBAAmBpB,YAAYoB,eAAe;QAEhDO,WAAWlC,+BAA+B2B;;0BAE1C,KAACtB;gBAAakB,MAAMM;gBAAUP,UAAUA;gBAAUG,kBAAkBA;;YACnE5B,aAAa2B,2BAAa,KAACtB;0BAAgBsB;;;;AAGlD;AAEA,OAAO,SAASW,kBAAkBC,KAAmB;IACnD,MAAMC,WAAWvC;IAEjB,MAAMgC,YAAYO,aAAa,QAAQjC,gBAAgBiB;IAEvD,qBAAO,KAACS;QAAW,GAAGM,KAAK;;AAC7B"}