@vkontakte/vkui 8.1.3 → 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 (619) 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/OnboardingTooltip/OnboardingTooltip.js +2 -1
  91. package/dist/components/OnboardingTooltip/OnboardingTooltip.js.map +1 -1
  92. package/dist/components/PanelHeader/PanelHeader.d.ts +1 -1
  93. package/dist/components/PanelHeader/PanelHeader.js.map +1 -1
  94. package/dist/components/Popper/Popper.js +1 -1
  95. package/dist/components/Popper/Popper.js.map +1 -1
  96. package/dist/components/PullToRefresh/PullToRefresh.d.ts.map +1 -1
  97. package/dist/components/PullToRefresh/PullToRefresh.js +8 -4
  98. package/dist/components/PullToRefresh/PullToRefresh.js.map +1 -1
  99. package/dist/components/Root/Root.d.ts +1 -1
  100. package/dist/components/Root/Root.d.ts.map +1 -1
  101. package/dist/components/Root/Root.js +14 -5
  102. package/dist/components/Root/Root.js.map +1 -1
  103. package/dist/components/SimpleGrid/SimpleGrid.d.ts +9 -8
  104. package/dist/components/SimpleGrid/SimpleGrid.d.ts.map +1 -1
  105. package/dist/components/SimpleGrid/SimpleGrid.js +9 -2
  106. package/dist/components/SimpleGrid/SimpleGrid.js.map +1 -1
  107. package/dist/components/Skeleton/Skeleton.d.ts.map +1 -1
  108. package/dist/components/Skeleton/Skeleton.js +3 -4
  109. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  110. package/dist/components/Snackbar/Snackbar.d.ts.map +1 -1
  111. package/dist/components/Snackbar/Snackbar.js +6 -3
  112. package/dist/components/Snackbar/Snackbar.js.map +1 -1
  113. package/dist/components/Spacing/Spacing.d.ts +1 -1
  114. package/dist/components/Spacing/Spacing.js.map +1 -1
  115. package/dist/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.d.ts +10 -0
  116. package/dist/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.d.ts.map +1 -0
  117. package/dist/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.js +54 -0
  118. package/dist/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.js.map +1 -0
  119. package/dist/components/Spinner/ExpressiveSpinner/icons.d.ts +18 -0
  120. package/dist/components/Spinner/ExpressiveSpinner/icons.d.ts.map +1 -0
  121. package/dist/components/Spinner/ExpressiveSpinner/icons.js +79 -0
  122. package/dist/components/Spinner/ExpressiveSpinner/icons.js.map +1 -0
  123. package/dist/components/Spinner/SvgIcon.d.ts +14 -0
  124. package/dist/components/Spinner/SvgIcon.d.ts.map +1 -0
  125. package/dist/components/Spinner/SvgIcon.js +20 -0
  126. package/dist/components/Spinner/SvgIcon.js.map +1 -0
  127. package/dist/components/Spinner/icons.d.ts +1 -1
  128. package/dist/components/Spinner/icons.d.ts.map +1 -1
  129. package/dist/components/Spinner/icons.js +10 -23
  130. package/dist/components/Spinner/icons.js.map +1 -1
  131. package/dist/components/SplitLayout/SplitLayout.d.ts +3 -3
  132. package/dist/components/SplitLayout/SplitLayout.js.map +1 -1
  133. package/dist/components/TabsItem/TabsItem.d.ts.map +1 -1
  134. package/dist/components/TabsItem/TabsItem.js +2 -5
  135. package/dist/components/TabsItem/TabsItem.js.map +1 -1
  136. package/dist/components/Tappable/Tappable.d.ts +2 -2
  137. package/dist/components/Tappable/Tappable.js.map +1 -1
  138. package/dist/components/WriteBar/WriteBar.d.ts +15 -1
  139. package/dist/components/WriteBar/WriteBar.d.ts.map +1 -1
  140. package/dist/components/WriteBar/WriteBar.js +35 -63
  141. package/dist/components/WriteBar/WriteBar.js.map +1 -1
  142. package/dist/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.d.ts +5 -0
  143. package/dist/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.d.ts.map +1 -0
  144. package/dist/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.js +15 -0
  145. package/dist/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.js.map +1 -0
  146. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormField.d.ts +8 -0
  147. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormField.d.ts.map +1 -0
  148. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormField.js +16 -0
  149. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormField.js.map +1 -0
  150. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.d.ts +5 -0
  151. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.d.ts.map +1 -0
  152. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.js +15 -0
  153. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.js.map +1 -0
  154. package/dist/components/WriteBar/WriteBarRoot/WriteBarRoot.d.ts +10 -0
  155. package/dist/components/WriteBar/WriteBarRoot/WriteBarRoot.d.ts.map +1 -0
  156. package/dist/components/WriteBar/WriteBarRoot/WriteBarRoot.js +16 -0
  157. package/dist/components/WriteBar/WriteBarRoot/WriteBarRoot.js.map +1 -0
  158. package/dist/components/WriteBar/WriteBarTextarea/WriteBarTextarea.d.ts +10 -0
  159. package/dist/components/WriteBar/WriteBarTextarea/WriteBarTextarea.d.ts.map +1 -0
  160. package/dist/components/WriteBar/WriteBarTextarea/WriteBarTextarea.js +39 -0
  161. package/dist/components/WriteBar/WriteBarTextarea/WriteBarTextarea.js.map +1 -0
  162. package/dist/components.css +1 -1
  163. package/dist/components.css.map +1 -1
  164. package/dist/cssm/components/ActionSheet/ActionSheet.js +2 -1
  165. package/dist/cssm/components/ActionSheet/ActionSheet.js.map +1 -1
  166. package/dist/cssm/components/AdaptivityProvider/AdaptivityContext.js.map +1 -1
  167. package/dist/cssm/components/AdaptivityProvider/AdaptivityProvider.js +2 -2
  168. package/dist/cssm/components/AdaptivityProvider/AdaptivityProvider.js.map +1 -1
  169. package/dist/cssm/components/AppRoot/AppRoot.js +0 -6
  170. package/dist/cssm/components/AppRoot/AppRoot.js.map +1 -1
  171. package/dist/cssm/components/AppRoot/AppRootContext.js +0 -1
  172. package/dist/cssm/components/AppRoot/AppRootContext.js.map +1 -1
  173. package/dist/cssm/components/Calendar/Calendar.js +2 -1
  174. package/dist/cssm/components/Calendar/Calendar.js.map +1 -1
  175. package/dist/cssm/components/CalendarDay/CalendarDay.js +4 -2
  176. package/dist/cssm/components/CalendarDay/CalendarDay.js.map +1 -1
  177. package/dist/cssm/components/CalendarDays/CalendarDays.js +2 -2
  178. package/dist/cssm/components/CalendarDays/CalendarDays.js.map +1 -1
  179. package/dist/cssm/components/CalendarHeader/CalendarHeader.js +4 -2
  180. package/dist/cssm/components/CalendarHeader/CalendarHeader.js.map +1 -1
  181. package/dist/cssm/components/CalendarRange/CalendarRange.js.map +1 -1
  182. package/dist/cssm/components/CalendarTime/CalendarTime.js +61 -50
  183. package/dist/cssm/components/CalendarTime/CalendarTime.js.map +1 -1
  184. package/dist/cssm/components/CalendarTime/CalendarTime.module.css +38 -0
  185. package/dist/cssm/components/CalendarTime/CalendarTimePicker.js +108 -48
  186. package/dist/cssm/components/CalendarTime/CalendarTimePicker.js.map +1 -1
  187. package/dist/cssm/components/CalendarTime/ComboBox.js +113 -0
  188. package/dist/cssm/components/CalendarTime/ComboBox.js.map +1 -0
  189. package/dist/cssm/components/CardScroll/CardScroll.js +2 -2
  190. package/dist/cssm/components/CardScroll/CardScroll.js.map +1 -1
  191. package/dist/cssm/components/CarouselBase/CarouselBase.js +3 -1
  192. package/dist/cssm/components/CarouselBase/CarouselBase.js.map +1 -1
  193. package/dist/cssm/components/ChipsSelect/useChipsSelect.js +2 -1
  194. package/dist/cssm/components/ChipsSelect/useChipsSelect.js.map +1 -1
  195. package/dist/cssm/components/ConfigProvider/ConfigProvider.js +8 -4
  196. package/dist/cssm/components/ConfigProvider/ConfigProvider.js.map +1 -1
  197. package/dist/cssm/components/ConfigProvider/ConfigProviderOverride.js +5 -1
  198. package/dist/cssm/components/ConfigProvider/ConfigProviderOverride.js.map +1 -1
  199. package/dist/cssm/components/ConfigProvider/ConfigProviderSubContexts.js +25 -0
  200. package/dist/cssm/components/ConfigProvider/ConfigProviderSubContexts.js.map +1 -0
  201. package/dist/cssm/components/ContentBadge/ContentBadge.js +39 -1
  202. package/dist/cssm/components/ContentBadge/ContentBadge.js.map +1 -1
  203. package/dist/cssm/components/ContentBadge/ContentBadge.module.css +88 -90
  204. package/dist/cssm/components/CustomSelect/CustomSelect.js +16 -10
  205. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  206. package/dist/cssm/components/DateInput/DateInput.js +4 -3
  207. package/dist/cssm/components/DateInput/DateInput.js.map +1 -1
  208. package/dist/cssm/components/DateRangeInput/DateRangeInput.js +2 -2
  209. package/dist/cssm/components/DateRangeInput/DateRangeInput.js.map +1 -1
  210. package/dist/cssm/components/Epic/ScrollSaver.js +1 -0
  211. package/dist/cssm/components/Epic/ScrollSaver.js.map +1 -1
  212. package/dist/cssm/components/FixedLayout/ParentWidthWrapper.js +43 -0
  213. package/dist/cssm/components/FixedLayout/ParentWidthWrapper.js.map +1 -0
  214. package/dist/cssm/components/Flex/Flex.js +5 -2
  215. package/dist/cssm/components/Flex/Flex.js.map +1 -1
  216. package/dist/cssm/components/GridAvatar/GridAvatar.module.css +1 -1
  217. package/dist/cssm/components/ImageBase/ImageBaseFloatElement/ImageBaseFloatElement.js +3 -1
  218. package/dist/cssm/components/ImageBase/ImageBaseFloatElement/ImageBaseFloatElement.js.map +1 -1
  219. package/dist/cssm/components/NativeSelect/NativeSelect.js +6 -2
  220. package/dist/cssm/components/NativeSelect/NativeSelect.js.map +1 -1
  221. package/dist/cssm/components/OnboardingTooltip/OnboardingTooltip.js +2 -1
  222. package/dist/cssm/components/OnboardingTooltip/OnboardingTooltip.js.map +1 -1
  223. package/dist/cssm/components/PanelHeader/PanelHeader.js.map +1 -1
  224. package/dist/cssm/components/Popper/Popper.js +1 -1
  225. package/dist/cssm/components/Popper/Popper.js.map +1 -1
  226. package/dist/cssm/components/PullToRefresh/PullToRefresh.js +8 -4
  227. package/dist/cssm/components/PullToRefresh/PullToRefresh.js.map +1 -1
  228. package/dist/cssm/components/PullToRefresh/PullToRefresh.module.css +1 -1
  229. package/dist/cssm/components/Root/Root.js +14 -5
  230. package/dist/cssm/components/Root/Root.js.map +1 -1
  231. package/dist/cssm/components/SimpleGrid/SimpleGrid.js +9 -2
  232. package/dist/cssm/components/SimpleGrid/SimpleGrid.js.map +1 -1
  233. package/dist/cssm/components/Skeleton/Skeleton.js +3 -4
  234. package/dist/cssm/components/Skeleton/Skeleton.js.map +1 -1
  235. package/dist/cssm/components/Snackbar/Snackbar.js +6 -3
  236. package/dist/cssm/components/Snackbar/Snackbar.js.map +1 -1
  237. package/dist/cssm/components/Spacing/Spacing.js.map +1 -1
  238. package/dist/cssm/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.js +56 -0
  239. package/dist/cssm/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.js.map +1 -0
  240. package/dist/cssm/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.module.css +13 -0
  241. package/dist/cssm/components/Spinner/ExpressiveSpinner/icons.js +79 -0
  242. package/dist/cssm/components/Spinner/ExpressiveSpinner/icons.js.map +1 -0
  243. package/dist/cssm/components/Spinner/SvgIcon.js +20 -0
  244. package/dist/cssm/components/Spinner/SvgIcon.js.map +1 -0
  245. package/dist/cssm/components/Spinner/icons.js +10 -23
  246. package/dist/cssm/components/Spinner/icons.js.map +1 -1
  247. package/dist/cssm/components/SplitLayout/SplitLayout.js.map +1 -1
  248. package/dist/cssm/components/TabsItem/TabsItem.js +2 -5
  249. package/dist/cssm/components/TabsItem/TabsItem.js.map +1 -1
  250. package/dist/cssm/components/Tappable/Tappable.js.map +1 -1
  251. package/dist/cssm/components/WriteBar/WriteBar.js +35 -64
  252. package/dist/cssm/components/WriteBar/WriteBar.js.map +1 -1
  253. package/dist/cssm/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.js +16 -0
  254. package/dist/cssm/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.js.map +1 -0
  255. package/dist/cssm/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.module.css +12 -0
  256. package/dist/cssm/components/WriteBar/WriteBarFormField/WriteBarFormField.js +17 -0
  257. package/dist/cssm/components/WriteBar/WriteBarFormField/WriteBarFormField.js.map +1 -0
  258. package/dist/cssm/components/WriteBar/WriteBarFormField/WriteBarFormField.module.css +18 -0
  259. package/dist/cssm/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.js +16 -0
  260. package/dist/cssm/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.js.map +1 -0
  261. package/dist/cssm/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.module.css +3 -0
  262. package/dist/cssm/components/WriteBar/WriteBarRoot/WriteBarRoot.js +17 -0
  263. package/dist/cssm/components/WriteBar/WriteBarRoot/WriteBarRoot.js.map +1 -0
  264. package/dist/cssm/components/WriteBar/WriteBarRoot/WriteBarRoot.module.css +15 -0
  265. package/dist/cssm/components/WriteBar/WriteBarTextarea/WriteBarTextarea.js +40 -0
  266. package/dist/cssm/components/WriteBar/WriteBarTextarea/WriteBarTextarea.js.map +1 -0
  267. package/dist/cssm/components/WriteBar/WriteBarTextarea/WriteBarTextarea.module.css +43 -0
  268. package/dist/cssm/helpers/math.js +6 -0
  269. package/dist/cssm/helpers/math.js.map +1 -1
  270. package/dist/cssm/hoc/withPlatform.js +3 -2
  271. package/dist/cssm/hoc/withPlatform.js.map +1 -1
  272. package/dist/cssm/hooks/useAdaptivityConditionalRender/types.js.map +1 -1
  273. package/dist/cssm/hooks/useAnimationFrame.js +40 -0
  274. package/dist/cssm/hooks/useAnimationFrame.js.map +1 -0
  275. package/dist/cssm/hooks/useAutoFocus.js +4 -1
  276. package/dist/cssm/hooks/useAutoFocus.js.map +1 -1
  277. package/dist/cssm/hooks/useColorScheme.js +3 -3
  278. package/dist/cssm/hooks/useColorScheme.js.map +1 -1
  279. package/dist/cssm/hooks/useConfigDirection.js +3 -3
  280. package/dist/cssm/hooks/useConfigDirection.js.map +1 -1
  281. package/dist/cssm/hooks/useDateInput.js +1 -2
  282. package/dist/cssm/hooks/useDateInput.js.map +1 -1
  283. package/dist/cssm/hooks/useFocusTrap/useAutoFocus.js +1 -0
  284. package/dist/cssm/hooks/useFocusTrap/useAutoFocus.js.map +1 -1
  285. package/dist/cssm/hooks/useFocusTrap/useFocusTrap.js +2 -0
  286. package/dist/cssm/hooks/useFocusTrap/useFocusTrap.js.map +1 -1
  287. package/dist/cssm/hooks/useFocusVisible.js +8 -13
  288. package/dist/cssm/hooks/useFocusVisible.js.map +1 -1
  289. package/dist/cssm/hooks/useFocusWithin.js +5 -4
  290. package/dist/cssm/hooks/useFocusWithin.js.map +1 -1
  291. package/dist/cssm/hooks/useGlobalEscKeyDown.js +17 -15
  292. package/dist/cssm/hooks/useGlobalEscKeyDown.js.map +1 -1
  293. package/dist/cssm/hooks/useGlobalOnClickOutside.js +6 -2
  294. package/dist/cssm/hooks/useGlobalOnClickOutside.js.map +1 -1
  295. package/dist/cssm/hooks/useKeyboardInputTracker.js +48 -41
  296. package/dist/cssm/hooks/useKeyboardInputTracker.js.map +1 -1
  297. package/dist/cssm/hooks/useLatestRef.js +13 -0
  298. package/dist/cssm/hooks/useLatestRef.js.map +1 -0
  299. package/dist/cssm/hooks/useLocale.js +3 -3
  300. package/dist/cssm/hooks/useLocale.js.map +1 -1
  301. package/dist/cssm/hooks/useMediaQueryMatch.js +1 -0
  302. package/dist/cssm/hooks/useMediaQueryMatch.js.map +1 -1
  303. package/dist/cssm/hooks/useMutationObserver.js +3 -3
  304. package/dist/cssm/hooks/useMutationObserver.js.map +1 -1
  305. package/dist/cssm/hooks/usePlatform.js +3 -3
  306. package/dist/cssm/hooks/usePlatform.js.map +1 -1
  307. package/dist/cssm/hooks/useResizeObserver.js +4 -6
  308. package/dist/cssm/hooks/useResizeObserver.js.map +1 -1
  309. package/dist/cssm/hooks/useSyncHTMLWithBaseVKUIClasses.js +2 -1
  310. package/dist/cssm/hooks/useSyncHTMLWithBaseVKUIClasses.js.map +1 -1
  311. package/dist/cssm/hooks/useSyncHTMLWithTokens.js +3 -1
  312. package/dist/cssm/hooks/useSyncHTMLWithTokens.js.map +1 -1
  313. package/dist/cssm/hooks/useWaitTransitionFinish.js +13 -15
  314. package/dist/cssm/hooks/useWaitTransitionFinish.js.map +1 -1
  315. package/dist/cssm/index.js +1 -0
  316. package/dist/cssm/index.js.map +1 -1
  317. package/dist/cssm/lib/array.js +18 -0
  318. package/dist/cssm/lib/array.js.map +1 -0
  319. package/dist/cssm/lib/curve.js +21 -0
  320. package/dist/cssm/lib/curve.js.map +1 -0
  321. package/dist/cssm/lib/dom.js +5 -2
  322. package/dist/cssm/lib/dom.js.map +1 -1
  323. package/dist/cssm/lib/fx.js +4 -55
  324. package/dist/cssm/lib/fx.js.map +1 -1
  325. package/dist/cssm/lib/layouts/index.js.map +1 -1
  326. package/dist/cssm/lib/layouts/layoutProps.js +11 -0
  327. package/dist/cssm/lib/layouts/layoutProps.js.map +1 -1
  328. package/dist/cssm/lib/layouts/resolveLayoutProps.js +13 -11
  329. package/dist/cssm/lib/layouts/resolveLayoutProps.js.map +1 -1
  330. package/dist/cssm/lib/layouts/types.js.map +1 -1
  331. package/dist/cssm/lib/material/shapes/Shape.js +18 -0
  332. package/dist/cssm/lib/material/shapes/Shape.js.map +1 -0
  333. package/dist/cssm/lib/material/shapes/shapes.js +2250 -0
  334. package/dist/cssm/lib/material/shapes/shapes.js.map +1 -0
  335. package/dist/cssm/lib/math.js +31 -0
  336. package/dist/cssm/lib/math.js.map +1 -0
  337. package/dist/cssm/lib/svg/path/approximate.js +57 -0
  338. package/dist/cssm/lib/svg/path/approximate.js.map +1 -0
  339. package/dist/cssm/lib/svg/path/interpolate.js +121 -0
  340. package/dist/cssm/lib/svg/path/interpolate.js.map +1 -0
  341. package/dist/cssm/lib/svg/path/path.js +50 -0
  342. package/dist/cssm/lib/svg/path/path.js.map +1 -0
  343. package/dist/cssm/lib/svg/path/point.js +3 -0
  344. package/dist/cssm/lib/svg/path/point.js.map +1 -0
  345. package/dist/cssm/lib/svg/path/transform.js +110 -0
  346. package/dist/cssm/lib/svg/path/transform.js.map +1 -0
  347. package/dist/cssm/lib/tokens/useTokenClassName.js +4 -1
  348. package/dist/cssm/lib/tokens/useTokenClassName.js.map +1 -1
  349. package/dist/cssm/lib/touch/UIPanGestureRecognizer.js +2 -2
  350. package/dist/cssm/lib/touch/UIPanGestureRecognizer.js.map +1 -1
  351. package/dist/cssm/styles/layout.css +273 -0
  352. package/dist/cssm/types.js +1 -4
  353. package/dist/cssm/types.js.map +1 -1
  354. package/dist/helpers/math.d.ts +4 -0
  355. package/dist/helpers/math.d.ts.map +1 -1
  356. package/dist/helpers/math.js +6 -0
  357. package/dist/helpers/math.js.map +1 -1
  358. package/dist/hoc/withPlatform.d.ts +1 -1
  359. package/dist/hoc/withPlatform.d.ts.map +1 -1
  360. package/dist/hoc/withPlatform.js +3 -2
  361. package/dist/hoc/withPlatform.js.map +1 -1
  362. package/dist/hooks/useAdaptivityConditionalRender/types.d.ts +2 -2
  363. package/dist/hooks/useAdaptivityConditionalRender/types.js.map +1 -1
  364. package/dist/hooks/useAnimationFrame.d.ts +16 -0
  365. package/dist/hooks/useAnimationFrame.d.ts.map +1 -0
  366. package/dist/hooks/useAnimationFrame.js +40 -0
  367. package/dist/hooks/useAnimationFrame.js.map +1 -0
  368. package/dist/hooks/useAutoFocus.js +4 -1
  369. package/dist/hooks/useAutoFocus.js.map +1 -1
  370. package/dist/hooks/useColorScheme.d.ts.map +1 -1
  371. package/dist/hooks/useColorScheme.js +3 -3
  372. package/dist/hooks/useColorScheme.js.map +1 -1
  373. package/dist/hooks/useConfigDirection.d.ts.map +1 -1
  374. package/dist/hooks/useConfigDirection.js +3 -3
  375. package/dist/hooks/useConfigDirection.js.map +1 -1
  376. package/dist/hooks/useDateInput.d.ts.map +1 -1
  377. package/dist/hooks/useDateInput.js +1 -2
  378. package/dist/hooks/useDateInput.js.map +1 -1
  379. package/dist/hooks/useFocusTrap/useAutoFocus.js +1 -0
  380. package/dist/hooks/useFocusTrap/useAutoFocus.js.map +1 -1
  381. package/dist/hooks/useFocusTrap/useFocusTrap.d.ts.map +1 -1
  382. package/dist/hooks/useFocusTrap/useFocusTrap.js +2 -0
  383. package/dist/hooks/useFocusTrap/useFocusTrap.js.map +1 -1
  384. package/dist/hooks/useFocusVisible.d.ts.map +1 -1
  385. package/dist/hooks/useFocusVisible.js +8 -13
  386. package/dist/hooks/useFocusVisible.js.map +1 -1
  387. package/dist/hooks/useFocusWithin.d.ts.map +1 -1
  388. package/dist/hooks/useFocusWithin.js +5 -4
  389. package/dist/hooks/useFocusWithin.js.map +1 -1
  390. package/dist/hooks/useGlobalEscKeyDown.d.ts.map +1 -1
  391. package/dist/hooks/useGlobalEscKeyDown.js +17 -15
  392. package/dist/hooks/useGlobalEscKeyDown.js.map +1 -1
  393. package/dist/hooks/useGlobalOnClickOutside.d.ts.map +1 -1
  394. package/dist/hooks/useGlobalOnClickOutside.js +6 -2
  395. package/dist/hooks/useGlobalOnClickOutside.js.map +1 -1
  396. package/dist/hooks/useKeyboardInputTracker.d.ts +1 -19
  397. package/dist/hooks/useKeyboardInputTracker.d.ts.map +1 -1
  398. package/dist/hooks/useKeyboardInputTracker.js +48 -41
  399. package/dist/hooks/useKeyboardInputTracker.js.map +1 -1
  400. package/dist/hooks/useLatestRef.d.ts +3 -0
  401. package/dist/hooks/useLatestRef.d.ts.map +1 -0
  402. package/dist/hooks/useLatestRef.js +13 -0
  403. package/dist/hooks/useLatestRef.js.map +1 -0
  404. package/dist/hooks/useLocale.d.ts.map +1 -1
  405. package/dist/hooks/useLocale.js +3 -3
  406. package/dist/hooks/useLocale.js.map +1 -1
  407. package/dist/hooks/useMediaQueryMatch.js +1 -0
  408. package/dist/hooks/useMediaQueryMatch.js.map +1 -1
  409. package/dist/hooks/useMutationObserver.d.ts +1 -2
  410. package/dist/hooks/useMutationObserver.d.ts.map +1 -1
  411. package/dist/hooks/useMutationObserver.js +3 -3
  412. package/dist/hooks/useMutationObserver.js.map +1 -1
  413. package/dist/hooks/usePlatform.d.ts.map +1 -1
  414. package/dist/hooks/usePlatform.js +3 -3
  415. package/dist/hooks/usePlatform.js.map +1 -1
  416. package/dist/hooks/useResizeObserver.d.ts.map +1 -1
  417. package/dist/hooks/useResizeObserver.js +4 -6
  418. package/dist/hooks/useResizeObserver.js.map +1 -1
  419. package/dist/hooks/useSyncHTMLWithBaseVKUIClasses.js +2 -1
  420. package/dist/hooks/useSyncHTMLWithBaseVKUIClasses.js.map +1 -1
  421. package/dist/hooks/useSyncHTMLWithTokens.js +3 -1
  422. package/dist/hooks/useSyncHTMLWithTokens.js.map +1 -1
  423. package/dist/hooks/useWaitTransitionFinish.d.ts.map +1 -1
  424. package/dist/hooks/useWaitTransitionFinish.js +13 -15
  425. package/dist/hooks/useWaitTransitionFinish.js.map +1 -1
  426. package/dist/index.d.ts +1 -0
  427. package/dist/index.d.ts.map +1 -1
  428. package/dist/index.js +1 -0
  429. package/dist/index.js.map +1 -1
  430. package/dist/lib/array.d.ts +17 -0
  431. package/dist/lib/array.d.ts.map +1 -0
  432. package/dist/lib/array.js +18 -0
  433. package/dist/lib/array.js.map +1 -0
  434. package/dist/lib/curve.d.ts +9 -0
  435. package/dist/lib/curve.d.ts.map +1 -0
  436. package/dist/lib/curve.js +21 -0
  437. package/dist/lib/curve.js.map +1 -0
  438. package/dist/lib/dom.d.ts +2 -1
  439. package/dist/lib/dom.d.ts.map +1 -1
  440. package/dist/lib/dom.js +5 -2
  441. package/dist/lib/dom.js.map +1 -1
  442. package/dist/lib/fx.d.ts +1 -8
  443. package/dist/lib/fx.d.ts.map +1 -1
  444. package/dist/lib/fx.js +4 -55
  445. package/dist/lib/fx.js.map +1 -1
  446. package/dist/lib/layouts/index.d.ts +1 -1
  447. package/dist/lib/layouts/index.d.ts.map +1 -1
  448. package/dist/lib/layouts/index.js.map +1 -1
  449. package/dist/lib/layouts/layoutProps.d.ts +7 -0
  450. package/dist/lib/layouts/layoutProps.d.ts.map +1 -1
  451. package/dist/lib/layouts/layoutProps.js +11 -0
  452. package/dist/lib/layouts/layoutProps.js.map +1 -1
  453. package/dist/lib/layouts/resolveLayoutProps.d.ts.map +1 -1
  454. package/dist/lib/layouts/resolveLayoutProps.js +13 -11
  455. package/dist/lib/layouts/resolveLayoutProps.js.map +1 -1
  456. package/dist/lib/layouts/types.d.ts +29 -0
  457. package/dist/lib/layouts/types.d.ts.map +1 -1
  458. package/dist/lib/layouts/types.js.map +1 -1
  459. package/dist/lib/material/shapes/Shape.d.ts +8 -0
  460. package/dist/lib/material/shapes/Shape.d.ts.map +1 -0
  461. package/dist/lib/material/shapes/Shape.js +18 -0
  462. package/dist/lib/material/shapes/Shape.js.map +1 -0
  463. package/dist/lib/material/shapes/shapes.d.ts +43 -0
  464. package/dist/lib/material/shapes/shapes.d.ts.map +1 -0
  465. package/dist/lib/material/shapes/shapes.js +2250 -0
  466. package/dist/lib/material/shapes/shapes.js.map +1 -0
  467. package/dist/lib/math.d.ts +23 -0
  468. package/dist/lib/math.d.ts.map +1 -0
  469. package/dist/lib/math.js +31 -0
  470. package/dist/lib/math.js.map +1 -0
  471. package/dist/lib/svg/path/approximate.d.ts +21 -0
  472. package/dist/lib/svg/path/approximate.d.ts.map +1 -0
  473. package/dist/lib/svg/path/approximate.js +57 -0
  474. package/dist/lib/svg/path/approximate.js.map +1 -0
  475. package/dist/lib/svg/path/interpolate.d.ts +5 -0
  476. package/dist/lib/svg/path/interpolate.d.ts.map +1 -0
  477. package/dist/lib/svg/path/interpolate.js +121 -0
  478. package/dist/lib/svg/path/interpolate.js.map +1 -0
  479. package/dist/lib/svg/path/path.d.ts +48 -0
  480. package/dist/lib/svg/path/path.d.ts.map +1 -0
  481. package/dist/lib/svg/path/path.js +50 -0
  482. package/dist/lib/svg/path/path.js.map +1 -0
  483. package/dist/lib/svg/path/point.d.ts +3 -0
  484. package/dist/lib/svg/path/point.d.ts.map +1 -0
  485. package/dist/lib/svg/path/point.js +3 -0
  486. package/dist/lib/svg/path/point.js.map +1 -0
  487. package/dist/lib/svg/path/transform.d.ts +64 -0
  488. package/dist/lib/svg/path/transform.d.ts.map +1 -0
  489. package/dist/lib/svg/path/transform.js +110 -0
  490. package/dist/lib/svg/path/transform.js.map +1 -0
  491. package/dist/lib/tokens/useTokenClassName.d.ts.map +1 -1
  492. package/dist/lib/tokens/useTokenClassName.js +4 -1
  493. package/dist/lib/tokens/useTokenClassName.js.map +1 -1
  494. package/dist/lib/touch/UIPanGestureRecognizer.d.ts.map +1 -1
  495. package/dist/lib/touch/UIPanGestureRecognizer.js +2 -2
  496. package/dist/lib/touch/UIPanGestureRecognizer.js.map +1 -1
  497. package/dist/types.d.ts +9 -0
  498. package/dist/types.d.ts.map +1 -1
  499. package/dist/types.js +1 -4
  500. package/dist/types.js.map +1 -1
  501. package/dist/vkui.css +1 -1
  502. package/dist/vkui.css.map +1 -1
  503. package/package.json +7 -6
  504. package/src/components/ActionSheet/ActionSheet.tsx +6 -3
  505. package/src/components/AdaptivityProvider/AdaptivityContext.tsx +3 -3
  506. package/src/components/AdaptivityProvider/AdaptivityProvider.tsx +2 -2
  507. package/src/components/AppRoot/AppRoot.tsx +1 -14
  508. package/src/components/AppRoot/AppRootContext.ts +0 -2
  509. package/src/components/Calendar/Calendar.tsx +2 -2
  510. package/src/components/CalendarDay/CalendarDay.tsx +4 -2
  511. package/src/components/CalendarDays/CalendarDays.tsx +2 -2
  512. package/src/components/CalendarHeader/CalendarHeader.tsx +4 -2
  513. package/src/components/CalendarRange/CalendarRange.tsx +2 -2
  514. package/src/components/CalendarTime/CalendarTime.module.css +38 -0
  515. package/src/components/CalendarTime/CalendarTime.module.css.d.ts.map +1 -1
  516. package/src/components/CalendarTime/CalendarTime.tsx +68 -55
  517. package/src/components/CalendarTime/CalendarTimePicker.tsx +148 -62
  518. package/src/components/CalendarTime/ComboBox.tsx +189 -0
  519. package/src/components/CardScroll/CardScroll.tsx +6 -5
  520. package/src/components/CarouselBase/CarouselBase.tsx +2 -1
  521. package/src/components/ChipsSelect/useChipsSelect.ts +1 -0
  522. package/src/components/ConfigProvider/ConfigProvider.tsx +6 -3
  523. package/src/components/ConfigProvider/ConfigProviderOverride.tsx +2 -1
  524. package/src/components/ConfigProvider/ConfigProviderSubContexts.tsx +43 -0
  525. package/src/components/ContentBadge/ContentBadge.module.css +84 -91
  526. package/src/components/ContentBadge/ContentBadge.module.css.d.ts.map +1 -1
  527. package/src/components/ContentBadge/ContentBadge.tsx +73 -5
  528. package/src/components/CustomSelect/CustomSelect.tsx +19 -10
  529. package/src/components/DateInput/DateInput.tsx +3 -3
  530. package/src/components/DateRangeInput/DateRangeInput.tsx +2 -2
  531. package/src/components/Epic/ScrollSaver.tsx +1 -0
  532. package/src/components/FixedLayout/ParentWidthWrapper.tsx +48 -0
  533. package/src/components/Flex/Flex.tsx +11 -6
  534. package/src/components/GridAvatar/GridAvatar.module.css +1 -1
  535. package/src/components/GridAvatar/GridAvatar.module.css.d.ts.map +1 -1
  536. package/src/components/ImageBase/ImageBaseFloatElement/ImageBaseFloatElement.tsx +1 -1
  537. package/src/components/NativeSelect/NativeSelect.tsx +4 -2
  538. package/src/components/OnboardingTooltip/OnboardingTooltip.tsx +1 -1
  539. package/src/components/PanelHeader/PanelHeader.tsx +1 -1
  540. package/src/components/Popper/Popper.tsx +1 -1
  541. package/src/components/PullToRefresh/PullToRefresh.module.css +1 -1
  542. package/src/components/PullToRefresh/PullToRefresh.tsx +10 -3
  543. package/src/components/Root/Root.tsx +10 -7
  544. package/src/components/SimpleGrid/SimpleGrid.tsx +25 -11
  545. package/src/components/Skeleton/Skeleton.tsx +6 -4
  546. package/src/components/Snackbar/Snackbar.tsx +6 -3
  547. package/src/components/Spacing/Spacing.tsx +1 -1
  548. package/src/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.module.css +13 -0
  549. package/src/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.module.css.d.ts.map +1 -0
  550. package/src/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.tsx +73 -0
  551. package/src/components/Spinner/ExpressiveSpinner/icons.tsx +104 -0
  552. package/src/components/Spinner/SvgIcon.tsx +31 -0
  553. package/src/components/Spinner/icons.tsx +10 -13
  554. package/src/components/SplitLayout/SplitLayout.tsx +3 -3
  555. package/src/components/TabsItem/TabsItem.tsx +4 -5
  556. package/src/components/Tappable/Tappable.tsx +2 -2
  557. package/src/components/WriteBar/WriteBar.tsx +25 -59
  558. package/src/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.module.css +12 -0
  559. package/src/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.module.css.d.ts.map +1 -0
  560. package/src/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.tsx +20 -0
  561. package/src/components/WriteBar/WriteBarFormField/WriteBarFormField.module.css +18 -0
  562. package/src/components/WriteBar/WriteBarFormField/WriteBarFormField.module.css.d.ts.map +1 -0
  563. package/src/components/WriteBar/WriteBarFormField/WriteBarFormField.tsx +22 -0
  564. package/src/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.module.css +3 -0
  565. package/src/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.module.css.d.ts.map +1 -0
  566. package/src/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.tsx +23 -0
  567. package/src/components/WriteBar/WriteBarRoot/WriteBarRoot.module.css +14 -0
  568. package/src/components/WriteBar/WriteBarRoot/WriteBarRoot.module.css.d.ts.map +1 -0
  569. package/src/components/WriteBar/WriteBarRoot/WriteBarRoot.tsx +31 -0
  570. package/src/components/WriteBar/WriteBarTextarea/WriteBarTextarea.module.css +42 -0
  571. package/src/components/WriteBar/WriteBarTextarea/WriteBarTextarea.module.css.d.ts.map +1 -0
  572. package/src/components/WriteBar/WriteBarTextarea/WriteBarTextarea.tsx +48 -0
  573. package/src/helpers/math.ts +8 -0
  574. package/src/hoc/withPlatform.tsx +3 -3
  575. package/src/hooks/useAdaptivityConditionalRender/types.ts +2 -2
  576. package/src/hooks/useAnimationFrame.tsx +42 -0
  577. package/src/hooks/useAutoFocus.ts +1 -1
  578. package/src/hooks/useColorScheme.ts +3 -4
  579. package/src/hooks/useConfigDirection.ts +3 -4
  580. package/src/hooks/useDateInput.ts +1 -2
  581. package/src/hooks/useFocusTrap/useAutoFocus.ts +1 -1
  582. package/src/hooks/useFocusTrap/useFocusTrap.tsx +2 -0
  583. package/src/hooks/useFocusVisible.ts +10 -18
  584. package/src/hooks/useFocusWithin.ts +26 -23
  585. package/src/hooks/useGlobalEscKeyDown.ts +12 -15
  586. package/src/hooks/useGlobalOnClickOutside.ts +5 -2
  587. package/src/hooks/useKeyboardInputTracker.ts +68 -55
  588. package/src/hooks/useLatestRef.ts +12 -0
  589. package/src/hooks/useLocale.ts +3 -4
  590. package/src/hooks/useMediaQueryMatch.ts +1 -1
  591. package/src/hooks/useMutationObserver.ts +2 -3
  592. package/src/hooks/usePlatform.ts +3 -4
  593. package/src/hooks/useResizeObserver.ts +4 -5
  594. package/src/hooks/useSyncHTMLWithBaseVKUIClasses.ts +1 -1
  595. package/src/hooks/useSyncHTMLWithTokens.ts +1 -1
  596. package/src/hooks/useWaitTransitionFinish.ts +15 -15
  597. package/src/index.ts +1 -0
  598. package/src/lib/array.ts +19 -0
  599. package/src/lib/curve.ts +36 -0
  600. package/src/lib/dom.tsx +10 -4
  601. package/src/lib/fx.ts +5 -63
  602. package/src/lib/layouts/index.ts +1 -0
  603. package/src/lib/layouts/layoutProps.ts +8 -0
  604. package/src/lib/layouts/resolveLayoutProps.ts +19 -17
  605. package/src/lib/layouts/types.ts +29 -0
  606. package/src/lib/material/shapes/Shape.tsx +17 -0
  607. package/src/lib/material/shapes/shapes.ts +329 -0
  608. package/src/lib/math.ts +37 -0
  609. package/src/lib/svg/path/approximate.ts +81 -0
  610. package/src/lib/svg/path/interpolate.ts +151 -0
  611. package/src/lib/svg/path/path.ts +102 -0
  612. package/src/lib/svg/path/point.ts +2 -0
  613. package/src/lib/svg/path/transform.ts +147 -0
  614. package/src/lib/tokens/useTokenClassName.ts +7 -5
  615. package/src/lib/touch/UIPanGestureRecognizer.ts +2 -2
  616. package/src/types.ts +16 -0
  617. package/dist/cssm/components/WriteBar/WriteBar.module.css +0 -118
  618. package/src/components/WriteBar/WriteBar.module.css +0 -116
  619. package/src/components/WriteBar/WriteBar.module.css.d.ts.map +0 -1
@@ -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":"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"}
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"}
@@ -0,0 +1,13 @@
1
+ .host {
2
+ display: flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ inline-size: 100%;
6
+ block-size: 100%;
7
+ color: var(--vkui--color_icon_medium);
8
+ will-change: contents;
9
+ }
10
+
11
+ .noColor {
12
+ color: currentColor;
13
+ }
@@ -0,0 +1,79 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { useAnimationFrame } from "../../../hooks/useAnimationFrame.js";
5
+ import { useReducedMotion } from "../../../lib/animation/index.js";
6
+ import * as shapes from "../../../lib/material/shapes/shapes.js";
7
+ import { interpolate } from "../../../lib/svg/path/interpolate.js";
8
+ import { svgPathToString } from "../../../lib/svg/path/path.js";
9
+ import * as operation from "../../../lib/svg/path/transform.js";
10
+ import { SvgIcon } from "../SvgIcon.js";
11
+ export function IconMaterial(props) {
12
+ return /*#__PURE__*/ _jsx(SvgIcon, {
13
+ size: props.size,
14
+ children: /*#__PURE__*/ _jsx(IconMaterialPath, {
15
+ ...props
16
+ })
17
+ });
18
+ }
19
+ const globalRotationDuration = 4666;
20
+ const morphDuration = 200;
21
+ const morphInterval = 650;
22
+ const fullRotation = 360;
23
+ const quarterRotation = fullRotation / 4;
24
+ function calcProgress(startTime, time, duration, delay = 0) {
25
+ const fullDuration = duration + delay;
26
+ const timeProgress = fullDuration * ((time - startTime) % fullDuration / fullDuration);
27
+ if (timeProgress < delay) {
28
+ return 0;
29
+ }
30
+ return (timeProgress - delay) / duration;
31
+ }
32
+ function IconMaterialPath({ size, polygons, disableAnimation }) {
33
+ const ref = React.useRef(null);
34
+ const morphSequence = React.useMemo(()=>{
35
+ function getShape(index, size) {
36
+ return shapes.shapeWithRotate(polygons[index], size);
37
+ }
38
+ return new Array(polygons.length).fill(0).map((_, index)=>{
39
+ return interpolate(getShape(index, size), getShape((index + 1) % polygons.length, size), {
40
+ maxSegmentLength: 2
41
+ });
42
+ });
43
+ }, [
44
+ size,
45
+ polygons
46
+ ]);
47
+ const initialPath = React.useMemo(()=>svgPathToString(morphSequence[0](0)), [
48
+ morphSequence
49
+ ]);
50
+ const callback = React.useCallback((time)=>{
51
+ const rotationAnimationProgress = calcProgress(0, time, globalRotationDuration);
52
+ const globalRotation = rotationAnimationProgress * fullRotation;
53
+ // TODO: spring({
54
+ // dampingRatio: 0.6,
55
+ // stiffness: 200,
56
+ // visibilityThreshold: 0.1,
57
+ // })
58
+ const morphProgress = calcProgress(0, time, morphDuration, morphInterval);
59
+ const roundMorphIndex = Math.floor(time / (morphDuration + morphInterval));
60
+ const currentMorphIndex = roundMorphIndex % morphSequence.length;
61
+ const morphRotationTargetAngle = roundMorphIndex * quarterRotation % fullRotation;
62
+ const rotation = morphProgress * quarterRotation + morphRotationTargetAngle + globalRotation;
63
+ const morphFn = morphSequence[currentMorphIndex];
64
+ const morph = morphFn(morphProgress);
65
+ ref.current.setAttribute('d', svgPathToString(operation.rotate(morph, size / 2, size / 2, rotation)));
66
+ }, [
67
+ morphSequence,
68
+ size
69
+ ]);
70
+ const isReducedMotion = useReducedMotion();
71
+ useAnimationFrame(callback, disableAnimation || isReducedMotion);
72
+ return /*#__PURE__*/ _jsx("path", {
73
+ ref: ref,
74
+ fill: "currentColor",
75
+ d: initialPath
76
+ });
77
+ }
78
+
79
+ //# sourceMappingURL=icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/components/Spinner/ExpressiveSpinner/icons.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useAnimationFrame } from '../../../hooks/useAnimationFrame';\nimport { useReducedMotion } from '../../../lib/animation';\nimport * as shapes from '../../../lib/material/shapes/shapes';\nimport { interpolate } from '../../../lib/svg/path/interpolate';\nimport { svgPathToString } from '../../../lib/svg/path/path';\nimport * as operation from '../../../lib/svg/path/transform';\nimport { SvgIcon } from '../SvgIcon';\n\ninterface IconMaterialProps {\n /**\n * Список форм.\n */\n polygons: readonly shapes.ShapeParameters[];\n /**\n * Размер иконки.\n */\n size: number;\n /**\n * Отключение анимации.\n */\n disableAnimation: boolean;\n}\n\nexport function IconMaterial(props: IconMaterialProps) {\n return (\n <SvgIcon size={props.size}>\n <IconMaterialPath {...props} />\n </SvgIcon>\n );\n}\n\nconst globalRotationDuration = 4666;\nconst morphDuration = 200;\nconst morphInterval = 650;\nconst fullRotation = 360;\nconst quarterRotation = fullRotation / 4;\n\nfunction calcProgress(startTime: number, time: number, duration: number, delay = 0) {\n const fullDuration = duration + delay;\n\n const timeProgress = fullDuration * (((time - startTime) % fullDuration) / fullDuration);\n\n if (timeProgress < delay) {\n return 0;\n }\n\n return (timeProgress - delay) / duration;\n}\n\nfunction IconMaterialPath({ size, polygons, disableAnimation }: IconMaterialProps) {\n const ref = React.useRef<SVGPathElement>(null);\n\n const morphSequence = React.useMemo(() => {\n function getShape(index: number, size: number) {\n return shapes.shapeWithRotate(polygons[index], size);\n }\n\n return new Array(polygons.length).fill(0).map((_, index) => {\n return interpolate(getShape(index, size), getShape((index + 1) % polygons.length, size), {\n maxSegmentLength: 2,\n });\n });\n }, [size, polygons]);\n\n const initialPath = React.useMemo(() => svgPathToString(morphSequence[0](0)), [morphSequence]);\n\n const callback = React.useCallback(\n (time: number) => {\n const rotationAnimationProgress = calcProgress(0, time, globalRotationDuration);\n const globalRotation = rotationAnimationProgress * fullRotation;\n\n // TODO: spring({\n // dampingRatio: 0.6,\n // stiffness: 200,\n // visibilityThreshold: 0.1,\n // })\n const morphProgress = calcProgress(0, time, morphDuration, morphInterval);\n\n const roundMorphIndex = Math.floor(time / (morphDuration + morphInterval));\n\n const currentMorphIndex = roundMorphIndex % morphSequence.length;\n\n const morphRotationTargetAngle = (roundMorphIndex * quarterRotation) % fullRotation;\n const rotation = morphProgress * quarterRotation + morphRotationTargetAngle + globalRotation;\n\n const morphFn = morphSequence[currentMorphIndex];\n const morph = morphFn(morphProgress);\n\n ref.current!.setAttribute(\n 'd',\n svgPathToString(operation.rotate(morph, size / 2, size / 2, rotation)),\n );\n },\n [morphSequence, size],\n );\n\n const isReducedMotion = useReducedMotion();\n useAnimationFrame(callback, disableAnimation || isReducedMotion);\n\n return <path ref={ref} fill=\"currentColor\" d={initialPath}></path>;\n}\n"],"names":["React","useAnimationFrame","useReducedMotion","shapes","interpolate","svgPathToString","operation","SvgIcon","IconMaterial","props","size","IconMaterialPath","globalRotationDuration","morphDuration","morphInterval","fullRotation","quarterRotation","calcProgress","startTime","time","duration","delay","fullDuration","timeProgress","polygons","disableAnimation","ref","useRef","morphSequence","useMemo","getShape","index","shapeWithRotate","Array","length","fill","map","_","maxSegmentLength","initialPath","callback","useCallback","rotationAnimationProgress","globalRotation","morphProgress","roundMorphIndex","Math","floor","currentMorphIndex","morphRotationTargetAngle","rotation","morphFn","morph","current","setAttribute","rotate","isReducedMotion","path","d"],"mappings":"AAAA;;AAEA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,iBAAiB,QAAQ,sCAAmC;AACrE,SAASC,gBAAgB,QAAQ,kCAAyB;AAC1D,YAAYC,YAAY,yCAAsC;AAC9D,SAASC,WAAW,QAAQ,uCAAoC;AAChE,SAASC,eAAe,QAAQ,gCAA6B;AAC7D,YAAYC,eAAe,qCAAkC;AAC7D,SAASC,OAAO,QAAQ,gBAAa;AAiBrC,OAAO,SAASC,aAAaC,KAAwB;IACnD,qBACE,KAACF;QAAQG,MAAMD,MAAMC,IAAI;kBACvB,cAAA,KAACC;YAAkB,GAAGF,KAAK;;;AAGjC;AAEA,MAAMG,yBAAyB;AAC/B,MAAMC,gBAAgB;AACtB,MAAMC,gBAAgB;AACtB,MAAMC,eAAe;AACrB,MAAMC,kBAAkBD,eAAe;AAEvC,SAASE,aAAaC,SAAiB,EAAEC,IAAY,EAAEC,QAAgB,EAAEC,QAAQ,CAAC;IAChF,MAAMC,eAAeF,WAAWC;IAEhC,MAAME,eAAeD,eAAgB,CAAA,AAAEH,CAAAA,OAAOD,SAAQ,IAAKI,eAAgBA,YAAW;IAEtF,IAAIC,eAAeF,OAAO;QACxB,OAAO;IACT;IAEA,OAAO,AAACE,CAAAA,eAAeF,KAAI,IAAKD;AAClC;AAEA,SAAST,iBAAiB,EAAED,IAAI,EAAEc,QAAQ,EAAEC,gBAAgB,EAAqB;IAC/E,MAAMC,MAAM1B,MAAM2B,MAAM,CAAiB;IAEzC,MAAMC,gBAAgB5B,MAAM6B,OAAO,CAAC;QAClC,SAASC,SAASC,KAAa,EAAErB,IAAY;YAC3C,OAAOP,OAAO6B,eAAe,CAACR,QAAQ,CAACO,MAAM,EAAErB;QACjD;QAEA,OAAO,IAAIuB,MAAMT,SAASU,MAAM,EAAEC,IAAI,CAAC,GAAGC,GAAG,CAAC,CAACC,GAAGN;YAChD,OAAO3B,YAAY0B,SAASC,OAAOrB,OAAOoB,SAAS,AAACC,CAAAA,QAAQ,CAAA,IAAKP,SAASU,MAAM,EAAExB,OAAO;gBACvF4B,kBAAkB;YACpB;QACF;IACF,GAAG;QAAC5B;QAAMc;KAAS;IAEnB,MAAMe,cAAcvC,MAAM6B,OAAO,CAAC,IAAMxB,gBAAgBuB,aAAa,CAAC,EAAE,CAAC,KAAK;QAACA;KAAc;IAE7F,MAAMY,WAAWxC,MAAMyC,WAAW,CAChC,CAACtB;QACC,MAAMuB,4BAA4BzB,aAAa,GAAGE,MAAMP;QACxD,MAAM+B,iBAAiBD,4BAA4B3B;QAEnD,iBAAiB;QACjB,uBAAuB;QACvB,oBAAoB;QACpB,8BAA8B;QAC9B,KAAK;QACL,MAAM6B,gBAAgB3B,aAAa,GAAGE,MAAMN,eAAeC;QAE3D,MAAM+B,kBAAkBC,KAAKC,KAAK,CAAC5B,OAAQN,CAAAA,gBAAgBC,aAAY;QAEvE,MAAMkC,oBAAoBH,kBAAkBjB,cAAcM,MAAM;QAEhE,MAAMe,2BAA2B,AAACJ,kBAAkB7B,kBAAmBD;QACvE,MAAMmC,WAAWN,gBAAgB5B,kBAAkBiC,2BAA2BN;QAE9E,MAAMQ,UAAUvB,aAAa,CAACoB,kBAAkB;QAChD,MAAMI,QAAQD,QAAQP;QAEtBlB,IAAI2B,OAAO,CAAEC,YAAY,CACvB,KACAjD,gBAAgBC,UAAUiD,MAAM,CAACH,OAAO1C,OAAO,GAAGA,OAAO,GAAGwC;IAEhE,GACA;QAACtB;QAAelB;KAAK;IAGvB,MAAM8C,kBAAkBtD;IACxBD,kBAAkBuC,UAAUf,oBAAoB+B;IAEhD,qBAAO,KAACC;QAAK/B,KAAKA;QAAKS,MAAK;QAAeuB,GAAGnB;;AAChD"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { RootComponent } from "../RootComponent/RootComponent.js";
3
+ /**
4
+ * Возвращает класс для иконки.
5
+ */ export function iconClassName(size) {
6
+ return `vkuiIcon vkuiIcon--${size} vkuiIcon--w-${size} vkuiIcon--h-${size}`;
7
+ }
8
+ export function SvgIcon({ size, children, ...restProps }) {
9
+ return /*#__PURE__*/ _jsx(RootComponent, {
10
+ Component: "svg",
11
+ baseClassName: iconClassName(size),
12
+ "aria-hidden": "true",
13
+ width: size,
14
+ height: size,
15
+ ...restProps,
16
+ children: children
17
+ });
18
+ }
19
+
20
+ //# sourceMappingURL=SvgIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/Spinner/SvgIcon.tsx"],"sourcesContent":["import { type HasRootRef } from '../../types';\nimport { RootComponent } from '../RootComponent/RootComponent';\n\n/**\n * Возвращает класс для иконки.\n */\nexport function iconClassName(size: number) {\n return `vkuiIcon vkuiIcon--${size} vkuiIcon--w-${size} vkuiIcon--h-${size}`;\n}\n\ninterface SvgIconProps extends React.ComponentProps<'svg'>, HasRootRef<SVGElement> {\n /**\n * Размер иконки.\n */\n size: number;\n}\n\nexport function SvgIcon({ size, children, ...restProps }: SvgIconProps) {\n return (\n <RootComponent\n Component=\"svg\"\n baseClassName={iconClassName(size)}\n aria-hidden=\"true\"\n width={size}\n height={size}\n {...restProps}\n >\n {children}\n </RootComponent>\n );\n}\n"],"names":["RootComponent","iconClassName","size","SvgIcon","children","restProps","Component","baseClassName","aria-hidden","width","height"],"mappings":";AACA,SAASA,aAAa,QAAQ,oCAAiC;AAE/D;;CAEC,GACD,OAAO,SAASC,cAAcC,IAAY;IACxC,OAAO,CAAC,mBAAmB,EAAEA,KAAK,aAAa,EAAEA,KAAK,aAAa,EAAEA,MAAM;AAC7E;AASA,OAAO,SAASC,QAAQ,EAAED,IAAI,EAAEE,QAAQ,EAAE,GAAGC,WAAyB;IACpE,qBACE,KAACL;QACCM,WAAU;QACVC,eAAeN,cAAcC;QAC7BM,eAAY;QACZC,OAAOP;QACPQ,QAAQR;QACP,GAAGG,SAAS;kBAEZD;;AAGP"}
@@ -1,13 +1,9 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- function iconClassName(size) {
3
- return `vkuiIcon vkuiIcon--${size} vkuiIcon--w-${size} vkuiIcon--h-${size}`;
4
- }
2
+ import * as React from "react";
3
+ import { SvgIcon } from "./SvgIcon.js";
5
4
  export function Icon16Spinner({ children }) {
6
- return /*#__PURE__*/ _jsx("svg", {
7
- className: iconClassName(16),
8
- "aria-hidden": "true",
9
- width: "16",
10
- height: "16",
5
+ return /*#__PURE__*/ _jsx(SvgIcon, {
6
+ size: 16,
11
7
  children: /*#__PURE__*/ _jsx("path", {
12
8
  fill: "currentColor",
13
9
  d: "M8 3.25a4.75 4.75 0 0 0-4.149 7.065.75.75 0 1 1-1.31.732A6.25 6.25 0 1 1 8 14.25a.75.75 0 0 1 .001-1.5 4.75 4.75 0 1 0 0-9.5Z",
@@ -16,11 +12,8 @@ export function Icon16Spinner({ children }) {
16
12
  });
17
13
  }
18
14
  export function Icon24Spinner({ children }) {
19
- return /*#__PURE__*/ _jsx("svg", {
20
- className: iconClassName(24),
21
- "aria-hidden": "true",
22
- width: "24",
23
- height: "24",
15
+ return /*#__PURE__*/ _jsx(SvgIcon, {
16
+ size: 24,
24
17
  children: /*#__PURE__*/ _jsx("path", {
25
18
  fill: "currentColor",
26
19
  d: "M16.394 5.077A8.2 8.2 0 0 0 4.58 15.49a.9.9 0 0 1-1.628.767A10 10 0 1 1 12 22a.9.9 0 0 1 0-1.8 8.2 8.2 0 0 0 4.394-15.123",
@@ -29,11 +22,8 @@ export function Icon24Spinner({ children }) {
29
22
  });
30
23
  }
31
24
  export function Icon32Spinner({ children }) {
32
- return /*#__PURE__*/ _jsx("svg", {
33
- className: iconClassName(32),
34
- "aria-hidden": "true",
35
- width: "32",
36
- height: "32",
25
+ return /*#__PURE__*/ _jsx(SvgIcon, {
26
+ size: 32,
37
27
  children: /*#__PURE__*/ _jsx("path", {
38
28
  fill: "currentColor",
39
29
  d: "M16 32a1.5 1.5 0 0 1 0-3c7.18 0 13-5.82 13-13S23.18 3 16 3 3 8.82 3 16c0 1.557.273 3.074.8 4.502A1.5 1.5 0 1 1 .986 21.54 16 16 0 0 1 0 16C0 7.163 7.163 0 16 0s16 7.163 16 16-7.163 16-16 16",
@@ -42,11 +32,8 @@ export function Icon32Spinner({ children }) {
42
32
  });
43
33
  }
44
34
  export function Icon44Spinner({ children }) {
45
- return /*#__PURE__*/ _jsx("svg", {
46
- className: iconClassName(44),
47
- "aria-hidden": "true",
48
- width: "44",
49
- height: "44",
35
+ return /*#__PURE__*/ _jsx(SvgIcon, {
36
+ size: 44,
50
37
  children: /*#__PURE__*/ _jsx("path", {
51
38
  fill: "currentColor",
52
39
  d: "M22 44a1.5 1.5 0 0 1 0-3c10.493 0 19-8.507 19-19S32.493 3 22 3 3 11.507 3 22c0 2.208.376 4.363 1.103 6.397a1.5 1.5 0 1 1-2.825 1.01A22 22 0 0 1 0 22C0 9.85 9.85 0 22 0s22 9.85 22 22-9.85 22-22 22",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Spinner/icons.tsx"],"sourcesContent":["import type * as React from 'react';\n\nfunction iconClassName(size: number) {\n return `vkuiIcon vkuiIcon--${size} vkuiIcon--w-${size} vkuiIcon--h-${size}`;\n}\n\nexport function Icon16Spinner({ children }: React.PropsWithChildren) {\n return (\n <svg className={iconClassName(16)} aria-hidden=\"true\" width=\"16\" height=\"16\">\n <path\n fill=\"currentColor\"\n d=\"M8 3.25a4.75 4.75 0 0 0-4.149 7.065.75.75 0 1 1-1.31.732A6.25 6.25 0 1 1 8 14.25a.75.75 0 0 1 .001-1.5 4.75 4.75 0 1 0 0-9.5Z\"\n >\n {children}\n </path>\n </svg>\n );\n}\n\nexport function Icon24Spinner({ children }: React.PropsWithChildren) {\n return (\n <svg className={iconClassName(24)} aria-hidden=\"true\" width=\"24\" height=\"24\">\n <path\n fill=\"currentColor\"\n d=\"M16.394 5.077A8.2 8.2 0 0 0 4.58 15.49a.9.9 0 0 1-1.628.767A10 10 0 1 1 12 22a.9.9 0 0 1 0-1.8 8.2 8.2 0 0 0 4.394-15.123\"\n >\n {children}\n </path>\n </svg>\n );\n}\n\nexport function Icon32Spinner({ children }: React.PropsWithChildren) {\n return (\n <svg className={iconClassName(32)} aria-hidden=\"true\" width=\"32\" height=\"32\">\n <path\n fill=\"currentColor\"\n d=\"M16 32a1.5 1.5 0 0 1 0-3c7.18 0 13-5.82 13-13S23.18 3 16 3 3 8.82 3 16c0 1.557.273 3.074.8 4.502A1.5 1.5 0 1 1 .986 21.54 16 16 0 0 1 0 16C0 7.163 7.163 0 16 0s16 7.163 16 16-7.163 16-16 16\"\n >\n {children}\n </path>\n </svg>\n );\n}\n\nexport function Icon44Spinner({ children }: React.PropsWithChildren) {\n return (\n <svg className={iconClassName(44)} aria-hidden=\"true\" width=\"44\" height=\"44\">\n <path\n fill=\"currentColor\"\n d=\"M22 44a1.5 1.5 0 0 1 0-3c10.493 0 19-8.507 19-19S32.493 3 22 3 3 11.507 3 22c0 2.208.376 4.363 1.103 6.397a1.5 1.5 0 1 1-2.825 1.01A22 22 0 0 1 0 22C0 9.85 9.85 0 22 0s22 9.85 22 22-9.85 22-22 22\"\n >\n {children}\n </path>\n </svg>\n );\n}\n"],"names":["iconClassName","size","Icon16Spinner","children","svg","className","aria-hidden","width","height","path","fill","d","Icon24Spinner","Icon32Spinner","Icon44Spinner"],"mappings":";AAEA,SAASA,cAAcC,IAAY;IACjC,OAAO,CAAC,mBAAmB,EAAEA,KAAK,aAAa,EAAEA,KAAK,aAAa,EAAEA,MAAM;AAC7E;AAEA,OAAO,SAASC,cAAc,EAAEC,QAAQ,EAA2B;IACjE,qBACE,KAACC;QAAIC,WAAWL,cAAc;QAAKM,eAAY;QAAOC,OAAM;QAAKC,QAAO;kBACtE,cAAA,KAACC;YACCC,MAAK;YACLC,GAAE;sBAEDR;;;AAIT;AAEA,OAAO,SAASS,cAAc,EAAET,QAAQ,EAA2B;IACjE,qBACE,KAACC;QAAIC,WAAWL,cAAc;QAAKM,eAAY;QAAOC,OAAM;QAAKC,QAAO;kBACtE,cAAA,KAACC;YACCC,MAAK;YACLC,GAAE;sBAEDR;;;AAIT;AAEA,OAAO,SAASU,cAAc,EAAEV,QAAQ,EAA2B;IACjE,qBACE,KAACC;QAAIC,WAAWL,cAAc;QAAKM,eAAY;QAAOC,OAAM;QAAKC,QAAO;kBACtE,cAAA,KAACC;YACCC,MAAK;YACLC,GAAE;sBAEDR;;;AAIT;AAEA,OAAO,SAASW,cAAc,EAAEX,QAAQ,EAA2B;IACjE,qBACE,KAACC;QAAIC,WAAWL,cAAc;QAAKM,eAAY;QAAOC,OAAM;QAAKC,QAAO;kBACtE,cAAA,KAACC;YACCC,MAAK;YACLC,GAAE;sBAEDR;;;AAIT"}
1
+ {"version":3,"sources":["../../../../src/components/Spinner/icons.tsx"],"sourcesContent":["import * as React from 'react';\nimport { SvgIcon } from './SvgIcon';\n\nexport function Icon16Spinner({ children }: React.PropsWithChildren) {\n return (\n <SvgIcon size={16}>\n <path\n fill=\"currentColor\"\n d=\"M8 3.25a4.75 4.75 0 0 0-4.149 7.065.75.75 0 1 1-1.31.732A6.25 6.25 0 1 1 8 14.25a.75.75 0 0 1 .001-1.5 4.75 4.75 0 1 0 0-9.5Z\"\n >\n {children}\n </path>\n </SvgIcon>\n );\n}\n\nexport function Icon24Spinner({ children }: React.PropsWithChildren) {\n return (\n <SvgIcon size={24}>\n <path\n fill=\"currentColor\"\n d=\"M16.394 5.077A8.2 8.2 0 0 0 4.58 15.49a.9.9 0 0 1-1.628.767A10 10 0 1 1 12 22a.9.9 0 0 1 0-1.8 8.2 8.2 0 0 0 4.394-15.123\"\n >\n {children}\n </path>\n </SvgIcon>\n );\n}\n\nexport function Icon32Spinner({ children }: React.PropsWithChildren) {\n return (\n <SvgIcon size={32}>\n <path\n fill=\"currentColor\"\n d=\"M16 32a1.5 1.5 0 0 1 0-3c7.18 0 13-5.82 13-13S23.18 3 16 3 3 8.82 3 16c0 1.557.273 3.074.8 4.502A1.5 1.5 0 1 1 .986 21.54 16 16 0 0 1 0 16C0 7.163 7.163 0 16 0s16 7.163 16 16-7.163 16-16 16\"\n >\n {children}\n </path>\n </SvgIcon>\n );\n}\n\nexport function Icon44Spinner({ children }: React.PropsWithChildren) {\n return (\n <SvgIcon size={44}>\n <path\n fill=\"currentColor\"\n d=\"M22 44a1.5 1.5 0 0 1 0-3c10.493 0 19-8.507 19-19S32.493 3 22 3 3 11.507 3 22c0 2.208.376 4.363 1.103 6.397a1.5 1.5 0 1 1-2.825 1.01A22 22 0 0 1 0 22C0 9.85 9.85 0 22 0s22 9.85 22 22-9.85 22-22 22\"\n >\n {children}\n </path>\n </SvgIcon>\n );\n}\n"],"names":["React","SvgIcon","Icon16Spinner","children","size","path","fill","d","Icon24Spinner","Icon32Spinner","Icon44Spinner"],"mappings":";AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,OAAO,QAAQ,eAAY;AAEpC,OAAO,SAASC,cAAc,EAAEC,QAAQ,EAA2B;IACjE,qBACE,KAACF;QAAQG,MAAM;kBACb,cAAA,KAACC;YACCC,MAAK;YACLC,GAAE;sBAEDJ;;;AAIT;AAEA,OAAO,SAASK,cAAc,EAAEL,QAAQ,EAA2B;IACjE,qBACE,KAACF;QAAQG,MAAM;kBACb,cAAA,KAACC;YACCC,MAAK;YACLC,GAAE;sBAEDJ;;;AAIT;AAEA,OAAO,SAASM,cAAc,EAAEN,QAAQ,EAA2B;IACjE,qBACE,KAACF;QAAQG,MAAM;kBACb,cAAA,KAACC;YACCC,MAAK;YACLC,GAAE;sBAEDJ;;;AAIT;AAEA,OAAO,SAASO,cAAc,EAAEP,QAAQ,EAA2B;IACjE,qBACE,KAACF;QAAQG,MAAM;kBACb,cAAA,KAACC;YACCC,MAAK;YACLC,GAAE;sBAEDJ;;;AAIT"}