@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/CalendarTime/CalendarTime.tsx"],"sourcesContent":["'use client';\n\nimport { useRef } from 'react';\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { Keys, pressedKey } from '../../lib/accessibility';\nimport { setHours, setMinutes } from '../../lib/date';\nimport { AdaptivityProvider } from '../AdaptivityProvider/AdaptivityProvider';\nimport { Button, type ButtonProps } from '../Button/Button';\nimport { CalendarTimePicker } from './CalendarTimePicker';\nimport styles from './CalendarTime.module.css';\n\nexport type CalendarTimeTestsProps = {\n /**\n * Передает атрибут `data-testid` для дропдауна выбора часа в календаре.\n */\n hoursTestId?: string | undefined;\n /**\n * Передает атрибут `data-testid` для дропдауна выбора минут в календаре.\n */\n minutesTestId?: string | undefined;\n /**\n * Передает атрибут `data-testid` для кнопки \"Готово\" в календаре.\n */\n doneButtonTestId?: string | undefined;\n};\n\nexport type CalendarDoneButtonProps = {\n /**\n * Кастомное отображение кнопки `\"Done\"`.\n */\n DoneButton?: React.ComponentType<ButtonProps> | undefined;\n /**\n * Текст отображаемый в кнопке `\"Done\"`.\n */\n doneButtonText?: string | undefined;\n /**\n * Управление отображением кнопки `\"Done\"`.\n */\n doneButtonShow?: boolean | undefined;\n /**\n * Блокировка взаимодействия с кнопкой \"Done\".\n */\n doneButtonDisabled?: boolean | undefined;\n /**\n * Обработки нажатия на кнопку `\"Done\"`.\n */\n onDoneButtonClick?: (() => void) | undefined;\n};\n\nexport interface CalendarTimeProps extends CalendarTimeTestsProps, CalendarDoneButtonProps {\n /**\n * Отображаемая дата.\n */\n value: Date;\n /**\n * Текст выпадающего списка с выбором часов. Делает его доступным для ассистивных технологий.\n */\n changeHoursLabel?: string | undefined;\n /**\n * Текст выпадающего списка с выбором минут. Делает его доступным для ассистивных технологий.\n */\n changeMinutesLabel?: string | undefined;\n /**\n * Обработчик изменения времени.\n */\n onChange?: ((value: Date) => void) | undefined;\n /**\n * Функция установки часа (для таймзонно-зависимого календаря).\n */\n setHours?: ((date: Date, hours: number) => Date) | undefined;\n /**\n * Функция установки минут (для таймзонно-зависимого календаря).\n */\n setMinutes?: ((date: Date, minutes: number) => Date) | undefined;\n /**\n * Функция для проверки блокировки выбора даты и времени.\n */\n isDayDisabled?: ((day: Date, withTime?: boolean) => boolean) | undefined;\n}\n\nconst hours: Array<{\n value: number;\n label: string;\n}> = [];\nfor (let i = 0; i < 24; i += 1) {\n hours.push({ value: i, label: String(i).padStart(2, '0') });\n}\n\nconst minutes: Array<{\n value: number;\n label: string;\n}> = [];\nfor (let i = 0; i < 60; i += 1) {\n minutes.push({ value: i, label: String(i).padStart(2, '0') });\n}\n\nexport const CalendarTime = ({\n value,\n onChange,\n onDoneButtonClick,\n changeHoursLabel,\n changeMinutesLabel,\n setHours: setHoursFn = setHours,\n setMinutes: setMinutesFn = setMinutes,\n isDayDisabled,\n doneButtonText = 'Готово',\n doneButtonDisabled = false,\n doneButtonShow = true,\n minutesTestId,\n hoursTestId,\n doneButtonTestId,\n DoneButton,\n}: CalendarTimeProps): React.ReactNode => {\n const hoursInputRef = useRef<HTMLInputElement | null>(null);\n const minutesInputRef = useRef<HTMLInputElement | null>(null);\n const doneButtonRef = useRef<HTMLButtonElement | null>(null);\n\n const localHours = isDayDisabled\n ? hours.map((hour) => {\n return { ...hour, disabled: isDayDisabled(setHoursFn(value, hour.value), true) };\n })\n : hours;\n\n const localMinutes = isDayDisabled\n ? minutes.map((minute) => {\n return { ...minute, disabled: isDayDisabled(setMinutesFn(value, minute.value), true) };\n })\n : minutes;\n\n const onPickerKeyDown = (e: React.KeyboardEvent) => {\n const key = pressedKey(e);\n /* Мы хотим иметь возможность быстро, по Enter перемещаться между\n * селектами с часами и минутами, также как мы это делаем по нажатию на Tab */\n if (key !== Keys.ENTER) {\n return;\n }\n\n const steps = [hoursInputRef, minutesInputRef, doneButtonRef].filter((ref) =>\n Boolean(ref.current),\n );\n const currentStepIndex = steps.findIndex((step) => step.current === e.target);\n const nextStepIndex = currentStepIndex + 1;\n if (nextStepIndex >= steps.length) {\n return;\n }\n const nextStep = steps[nextStepIndex];\n\n if (nextStep.current) {\n e.preventDefault();\n nextStep.current?.focus();\n }\n };\n\n const stopPropagationOfEscapeKeyboardEventWhenSelectIsOpen = React.useCallback(\n (event: React.KeyboardEvent, isOpen: boolean) => {\n if (isOpen && event.key === 'Escape') {\n event.stopPropagation();\n }\n },\n [],\n );\n\n const onSelectInputKeyDown = (e: React.KeyboardEvent, isOpen: boolean) => {\n onPickerKeyDown(e);\n stopPropagationOfEscapeKeyboardEventWhenSelectIsOpen(e, isOpen);\n };\n\n const renderDoneButton = () => {\n const ButtonComponent = DoneButton ?? Button;\n return (\n <ButtonComponent\n mode=\"secondary\"\n onClick={onDoneButtonClick}\n size=\"l\"\n getRootRef={doneButtonRef}\n onKeyDown={onPickerKeyDown}\n disabled={doneButtonDisabled}\n data-testid={doneButtonTestId}\n >\n {doneButtonText}\n </ButtonComponent>\n );\n };\n\n return (\n <div className={classNames(styles.host, !doneButtonShow && styles.host__withoutDone)}>\n <CalendarTimePicker\n value={value}\n getNumericValue={(v) => v.getHours()}\n onChange={onChange}\n options={localHours}\n setTime={setHoursFn}\n onInputKeyDown={onSelectInputKeyDown}\n inputRef={hoursInputRef}\n inputLabel={changeHoursLabel}\n inputTestId={hoursTestId}\n />\n <div className={styles.divider}>:</div>\n <CalendarTimePicker\n value={value}\n getNumericValue={(v) => v.getMinutes()}\n onChange={onChange}\n options={localMinutes}\n setTime={setMinutesFn}\n onInputKeyDown={onSelectInputKeyDown}\n inputRef={minutesInputRef}\n inputLabel={changeMinutesLabel}\n inputTestId={minutesTestId}\n />\n {doneButtonShow && (\n <div className={styles.button}>\n <AdaptivityProvider density=\"compact\">{renderDoneButton()}</AdaptivityProvider>\n </div>\n )}\n </div>\n );\n};\n"],"names":["useRef","React","classNames","Keys","pressedKey","setHours","setMinutes","AdaptivityProvider","Button","CalendarTimePicker","hours","i","push","value","label","String","padStart","minutes","CalendarTime","onChange","onDoneButtonClick","changeHoursLabel","changeMinutesLabel","setHoursFn","setMinutesFn","isDayDisabled","doneButtonText","doneButtonDisabled","doneButtonShow","minutesTestId","hoursTestId","doneButtonTestId","DoneButton","hoursInputRef","minutesInputRef","doneButtonRef","localHours","map","hour","disabled","localMinutes","minute","onPickerKeyDown","e","key","ENTER","steps","filter","ref","Boolean","current","currentStepIndex","findIndex","step","target","nextStepIndex","length","nextStep","preventDefault","focus","stopPropagationOfEscapeKeyboardEventWhenSelectIsOpen","useCallback","event","isOpen","stopPropagation","onSelectInputKeyDown","renderDoneButton","ButtonComponent","mode","onClick","size","getRootRef","onKeyDown","data-testid","div","className","getNumericValue","v","getHours","options","setTime","onInputKeyDown","inputRef","inputLabel","inputTestId","getMinutes","density"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/CalendarTime/CalendarTime.tsx"],"sourcesContent":["'use client';\n\nimport { useRef } from 'react';\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { Keys, pressedKey } from '../../lib/accessibility';\nimport { setHours, setMinutes } from '../../lib/date';\nimport { AdaptivityProvider } from '../AdaptivityProvider/AdaptivityProvider';\nimport { Button, type ButtonProps } from '../Button/Button';\nimport { CalendarTimePicker, padStartTimeValue } from './CalendarTimePicker';\nimport styles from './CalendarTime.module.css';\n\nconst MAX_HOURS = 23;\nconst MAX_MINUTES = 59;\n\nfunction generateLabels(\n min: number,\n max: number,\n): Array<{\n value: string;\n label: string;\n}> {\n const array = new Array(Math.ceil(max - min + 1));\n\n for (let i = min; i <= max; i += 1) {\n const value = padStartTimeValue(i);\n\n array[i - min] = { value, label: value };\n }\n\n return array;\n}\n\nconst hours = generateLabels(0, MAX_HOURS);\n\nconst minutes = generateLabels(0, MAX_MINUTES);\n\nexport type CalendarTimeTestsProps = {\n /**\n * Передает атрибут `data-testid` для дропдауна выбора часа в календаре.\n */\n hoursTestId?: string | undefined;\n /**\n * Передает атрибут `data-testid` для дропдауна выбора минут в календаре.\n */\n minutesTestId?: string | undefined;\n /**\n * Передает атрибут `data-testid` для кнопки \"Готово\" в календаре.\n */\n doneButtonTestId?: string | undefined;\n};\n\nexport type CalendarDoneButtonProps = {\n /**\n * Кастомное отображение кнопки `\"Done\"`.\n */\n DoneButton?: React.ComponentType<ButtonProps> | undefined;\n /**\n * Текст отображаемый в кнопке `\"Done\"`.\n */\n doneButtonText?: string | undefined;\n /**\n * Управление отображением кнопки `\"Done\"`.\n */\n doneButtonShow?: boolean | undefined;\n /**\n * Блокировка взаимодействия с кнопкой \"Done\".\n */\n doneButtonDisabled?: boolean | undefined;\n /**\n * Обработки нажатия на кнопку `\"Done\"`.\n */\n onDoneButtonClick?: (() => void) | undefined;\n};\n\nexport interface CalendarTimeProps extends CalendarTimeTestsProps, CalendarDoneButtonProps {\n /**\n * Отображаемая дата.\n */\n value: Date;\n /**\n * Текст выпадающего списка с выбором часов. Делает его доступным для ассистивных технологий.\n */\n changeHoursLabel?: string | undefined;\n /**\n * Текст выпадающего списка с выбором минут. Делает его доступным для ассистивных технологий.\n */\n changeMinutesLabel?: string | undefined;\n /**\n * Обработчик изменения времени.\n */\n onChange?: ((value: Date) => void) | undefined;\n /**\n * Функция установки часа (для таймзонно-зависимого календаря).\n */\n setHours?: ((date: Date, hours: number) => Date) | undefined;\n /**\n * Функция установки минут (для таймзонно-зависимого календаря).\n */\n setMinutes?: ((date: Date, minutes: number) => Date) | undefined;\n /**\n * Функция для проверки блокировки выбора даты и времени.\n */\n isDayDisabled?: ((day: Date, withTime?: boolean) => boolean) | undefined;\n}\n\nexport const CalendarTime = ({\n value,\n onChange,\n onDoneButtonClick,\n changeHoursLabel,\n changeMinutesLabel,\n setHours: setHoursFn = setHours,\n setMinutes: setMinutesFn = setMinutes,\n doneButtonText = 'Готово',\n doneButtonDisabled = false,\n doneButtonShow = true,\n minutesTestId,\n hoursTestId,\n doneButtonTestId,\n DoneButton,\n isDayDisabled,\n}: CalendarTimeProps): React.ReactNode => {\n const hoursInputRef = useRef<HTMLInputElement | null>(null);\n const minutesInputRef = useRef<HTMLInputElement | null>(null);\n const doneButtonRef = useRef<HTMLButtonElement | null>(null);\n\n const localHours = isDayDisabled\n ? hours.map((hour) => {\n return { ...hour, disabled: isDayDisabled(setHoursFn(value, Number(hour.value)), true) };\n })\n : hours;\n\n const localMinutes = isDayDisabled\n ? minutes.map((minute) => {\n return {\n ...minute,\n disabled: isDayDisabled(setMinutesFn(value, Number(minute.value)), true),\n };\n })\n : minutes;\n\n const onPickerKeyDown = (e: React.KeyboardEvent) => {\n const key = pressedKey(e);\n /* Мы хотим иметь возможность быстро, по Enter перемещаться между\n * селектами с часами и минутами, также как мы это делаем по нажатию на Tab */\n if (key !== Keys.ENTER) {\n return;\n }\n\n const steps = [hoursInputRef, minutesInputRef, doneButtonRef].filter((ref) =>\n Boolean(ref.current),\n );\n const currentStepIndex = steps.findIndex((step) => step.current === e.target);\n const nextStepIndex = currentStepIndex + 1;\n if (nextStepIndex >= steps.length) {\n return;\n }\n const nextStep = steps[nextStepIndex];\n\n if (nextStep.current) {\n e.preventDefault();\n nextStep.current?.focus();\n }\n };\n\n const onHoursInputEnd = () => {\n minutesInputRef.current?.focus();\n };\n\n const renderDoneButton = () => {\n const ButtonComponent = DoneButton ?? Button;\n return (\n <ButtonComponent\n mode=\"secondary\"\n onClick={onDoneButtonClick}\n size=\"l\"\n getRootRef={doneButtonRef}\n onKeyDown={onPickerKeyDown}\n disabled={doneButtonDisabled}\n data-testid={doneButtonTestId}\n >\n {doneButtonText}\n </ButtonComponent>\n );\n };\n\n return (\n <div className={classNames(styles.host, !doneButtonShow && styles.host__withoutDone)}>\n <AdaptivityProvider density=\"compact\">\n <div className={styles.picker}>\n <CalendarTimePicker\n valueDate={value}\n value={value.getHours()}\n onChange={onChange}\n options={localHours}\n setTime={setHoursFn}\n onKeyDown={onPickerKeyDown}\n inputRef={hoursInputRef}\n inputLabel={changeHoursLabel}\n inputTestId={hoursTestId}\n maxValue={MAX_HOURS}\n onInputEnd={onHoursInputEnd}\n isDayDisabled={isDayDisabled}\n />\n </div>\n <div className={styles.divider}>:</div>\n <div className={styles.picker}>\n <CalendarTimePicker\n valueDate={value}\n value={value.getMinutes()}\n onChange={onChange}\n options={localMinutes}\n setTime={setMinutesFn}\n onKeyDown={onPickerKeyDown}\n inputRef={minutesInputRef}\n inputLabel={changeMinutesLabel}\n inputTestId={minutesTestId}\n maxValue={MAX_MINUTES}\n isDayDisabled={isDayDisabled}\n />\n </div>\n </AdaptivityProvider>\n {doneButtonShow && (\n <div className={styles.button}>\n <AdaptivityProvider density=\"compact\">{renderDoneButton()}</AdaptivityProvider>\n </div>\n )}\n </div>\n );\n};\n"],"names":["useRef","React","classNames","Keys","pressedKey","setHours","setMinutes","AdaptivityProvider","Button","CalendarTimePicker","padStartTimeValue","MAX_HOURS","MAX_MINUTES","generateLabels","min","max","array","Array","Math","ceil","i","value","label","hours","minutes","CalendarTime","onChange","onDoneButtonClick","changeHoursLabel","changeMinutesLabel","setHoursFn","setMinutesFn","doneButtonText","doneButtonDisabled","doneButtonShow","minutesTestId","hoursTestId","doneButtonTestId","DoneButton","isDayDisabled","hoursInputRef","minutesInputRef","doneButtonRef","localHours","map","hour","disabled","Number","localMinutes","minute","onPickerKeyDown","e","key","ENTER","steps","filter","ref","Boolean","current","currentStepIndex","findIndex","step","target","nextStepIndex","length","nextStep","preventDefault","focus","onHoursInputEnd","renderDoneButton","ButtonComponent","mode","onClick","size","getRootRef","onKeyDown","data-testid","div","className","density","valueDate","getHours","options","setTime","inputRef","inputLabel","inputTestId","maxValue","onInputEnd","getMinutes"],"mappings":"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"}
@@ -1,10 +1,9 @@
1
1
  import * as React from 'react';
2
- import { type SelectProps } from '../CustomSelect/CustomSelect';
3
- interface CalendarTimePickerProps extends Pick<SelectProps, 'onInputKeyDown'> {
4
- value: Date;
5
- getNumericValue: (date: Date) => number;
6
- options: Array<{
7
- value: number;
2
+ export declare function padStartTimeValue(value: Pick<string, 'toString'>): string;
3
+ interface CalendarTimePickerProps {
4
+ valueDate: Date;
5
+ options: ReadonlyArray<{
6
+ value: string;
8
7
  label: string;
9
8
  }>;
10
9
  onChange?: ((value: Date) => void) | undefined;
@@ -12,7 +11,12 @@ interface CalendarTimePickerProps extends Pick<SelectProps, 'onInputKeyDown'> {
12
11
  inputRef: React.Ref<HTMLInputElement>;
13
12
  inputLabel?: string | undefined;
14
13
  inputTestId?: string | undefined;
14
+ value: number;
15
+ maxValue: number;
16
+ onInputEnd?: () => void;
17
+ onKeyDown?: (e: React.KeyboardEvent) => void;
18
+ isDayDisabled?: ((day: Date, withTime?: boolean) => boolean) | undefined;
15
19
  }
16
- export declare const CalendarTimePicker: ({ value, getNumericValue, options, onChange, setTime, inputRef, inputLabel, inputTestId, onInputKeyDown, }: CalendarTimePickerProps) => import("react/jsx-runtime").JSX.Element;
20
+ export declare const CalendarTimePicker: ({ valueDate, value, options, onChange, setTime, inputRef, inputLabel, inputTestId, maxValue, onInputEnd, onKeyDown: onKeyDownProp, isDayDisabled, }: CalendarTimePickerProps) => import("react/jsx-runtime").JSX.Element;
17
21
  export {};
18
22
  //# sourceMappingURL=CalendarTimePicker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CalendarTimePicker.d.ts","sourceRoot":"","sources":["../../../src/components/CalendarTime/CalendarTimePicker.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAkB9E,UAAU,uBAAwB,SAAQ,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC;IAC3E,KAAK,EAAE,IAAI,CAAC;IACZ,eAAe,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC;IACxC,OAAO,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC/C,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAGD,eAAO,MAAM,kBAAkB,GAAI,4GAUhC,uBAAuB,4CAmDzB,CAAC"}
1
+ {"version":3,"file":"CalendarTimePicker.d.ts","sourceRoot":"","sources":["../../../src/components/CalendarTime/CalendarTimePicker.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAiC/B,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,MAAM,CAEzE;AAkBD,UAAU,uBAAuB;IAC/B,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,aAAa,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC/C,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC;IAC7C,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC;CAC1E;AAGD,eAAO,MAAM,kBAAkB,GAAI,qJAahC,uBAAuB,4CAkGzB,CAAC"}
@@ -1,60 +1,120 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import { useState } from "react";
4
3
  import * as React from "react";
5
- import { AdaptivityProvider } from "../AdaptivityProvider/AdaptivityProvider.js";
6
- import { CustomSelect } from "../CustomSelect/CustomSelect.js";
7
- import { CustomSelectOption } from "../CustomSelectOption/CustomSelectOption.js";
8
- const selectFilterFn = ()=>true;
9
- const validateValue = (value, validValues)=>{
10
- const numValue = Number(value);
11
- return !isNaN(numValue) && validValues.some((v)=>v.value === numValue);
12
- };
13
- /* eslint-enable jsdoc/require-jsdoc */ export const CalendarTimePicker = ({ value, getNumericValue, options, onChange, setTime, inputRef, inputLabel, inputTestId, onInputKeyDown })=>{
14
- const [inputValue, setInputValue] = useState(undefined);
15
- const onBlur = React.useCallback(()=>{
16
- setInputValue(undefined);
4
+ import { clamp, overflow } from "../../helpers/math.js";
5
+ import { useBooleanState } from "../../hooks/useBooleanState.js";
6
+ import { useExternRef } from "../../hooks/useExternRef.js";
7
+ import { Keys } from "../../lib/accessibility.js";
8
+ import { isActiveElement } from "../../lib/dom.js";
9
+ import { ComboBox } from "./ComboBox.js";
10
+ function validateValueInput(event, maxValue) {
11
+ if (event.target.value === '') {
12
+ return event.target.value;
13
+ }
14
+ const inputValue = /\d\d?/.exec(event.target.value)?.[0] || '';
15
+ if (event.target.value !== inputValue) {
16
+ return inputValue;
17
+ }
18
+ const inputValueNumber = Number(inputValue);
19
+ if (isNaN(inputValueNumber)) {
20
+ return '';
21
+ }
22
+ const resultValueNumber = clamp(inputValueNumber, 0, maxValue);
23
+ if (inputValueNumber === resultValueNumber) {
24
+ return inputValue;
25
+ }
26
+ return resultValueNumber.toString();
27
+ }
28
+ export function padStartTimeValue(value) {
29
+ return value.toString().padStart(2, '0');
30
+ }
31
+ function newValueOnInputKeyDown(event, maxValue) {
32
+ if (!(event.target instanceof HTMLInputElement)) {
33
+ return '';
34
+ }
35
+ switch(event.key){
36
+ case Keys.ARROW_UP:
37
+ return padStartTimeValue(overflow(Number(event.target.value) + 1, 0, maxValue));
38
+ case Keys.ARROW_DOWN:
39
+ return padStartTimeValue(overflow(Number(event.target.value) - 1, 0, maxValue));
40
+ }
41
+ return event.target.value;
42
+ }
43
+ /* eslint-enable jsdoc/require-jsdoc */ export const CalendarTimePicker = ({ valueDate, value, options, onChange, setTime, inputRef, inputLabel, inputTestId, maxValue, onInputEnd, onKeyDown: onKeyDownProp, isDayDisabled })=>{
44
+ const ref = useExternRef(inputRef);
45
+ const [isInputFocused, onFocus, setInputBlur] = useBooleanState(false);
46
+ const [editableValue, setEditableValue] = React.useState(padStartTimeValue(value));
47
+ const updateValue = (newValue)=>{
48
+ const newDate = setTime(valueDate, Number(newValue));
49
+ if (isDayDisabled?.(newDate, true)) {
50
+ return;
51
+ }
52
+ setEditableValue(newValue);
53
+ onChange?.(newDate);
54
+ };
55
+ // Обработка ввода
56
+ const onInput = (event)=>{
57
+ const validateValue = validateValueInput(event, maxValue);
58
+ updateValue(validateValue);
59
+ if (validateValue.length > 1 && event.target.selectionStart) {
60
+ onInputEnd?.();
61
+ }
62
+ };
63
+ // Управление числом с клавиатуры стрелками вниз/вверх.
64
+ const onKeyDown = (event)=>{
65
+ const validateValue = newValueOnInputKeyDown(event, maxValue);
66
+ updateValue(validateValue);
67
+ };
68
+ // Обработка каретки если время уже задано
69
+ const onSelectionChange = React.useCallback((event)=>{
70
+ if (event.target instanceof HTMLInputElement) {
71
+ if (event.target.value.length > 1 && isActiveElement(event.target)) {
72
+ event.target.select();
73
+ }
74
+ }
17
75
  }, []);
18
- const _onChange = React.useCallback((_, newValue)=>onChange?.(setTime(value, Number(newValue))), [
19
- onChange,
20
- setTime,
21
- value
76
+ React.useEffect(()=>{
77
+ const el = ref.current;
78
+ el?.addEventListener('selectionchange', onSelectionChange);
79
+ return ()=>{
80
+ el?.removeEventListener('selectionchange', onSelectionChange);
81
+ };
82
+ }, [
83
+ onSelectionChange,
84
+ ref
22
85
  ]);
23
- const onPickerValueChange = (e)=>{
24
- const numericValue = e.target.value.replace(/\D/g, '');
25
- setInputValue(numericValue);
26
- if (validateValue(numericValue, options)) {
27
- onChange?.(setTime(value, Number(numericValue)));
28
- }
86
+ // Обработка ухода с поля ввода
87
+ const onBlur = ()=>{
88
+ setInputBlur();
89
+ setEditableValue((value)=>{
90
+ const newValue = padStartTimeValue(value);
91
+ return newValue;
92
+ });
93
+ };
94
+ // Обработка значения при нажатии в барабане
95
+ const onClickOption = (newValue)=>{
96
+ updateValue(newValue);
29
97
  };
98
+ const valueAsString = padStartTimeValue(value);
99
+ const viewValue = isInputFocused || padStartTimeValue(editableValue) !== valueAsString ? editableValue : valueAsString;
30
100
  return /*#__PURE__*/ _jsx("div", {
31
101
  className: "vkuiCalendarTime__picker",
32
- children: /*#__PURE__*/ _jsx(AdaptivityProvider, {
33
- density: "compact",
34
- children: /*#__PURE__*/ _jsx(CustomSelect, {
35
- value: getNumericValue(value),
36
- options: options,
37
- onChange: _onChange,
38
- forceDropdownPortal: false,
39
- searchable: true,
40
- filterFn: selectFilterFn,
41
- onInputChange: onPickerValueChange,
42
- onInputKeyDown: onInputKeyDown,
43
- renderOption: ({ children: optionChildren, ...optionProps })=>/*#__PURE__*/ _jsx(CustomSelectOption, {
44
- ...optionProps,
45
- textNoWrap: true,
46
- children: optionChildren
47
- }),
48
- slotProps: {
49
- input: {
50
- 'aria-label': inputLabel,
51
- 'data-testid': inputTestId,
52
- 'value': inputValue,
53
- 'getRootRef': inputRef,
54
- onBlur
55
- }
102
+ children: /*#__PURE__*/ _jsx(ComboBox, {
103
+ value: viewValue,
104
+ slotProps: {
105
+ input: {
106
+ 'getRootRef': ref,
107
+ 'aria-label': inputLabel,
108
+ 'data-testid': inputTestId,
109
+ 'onKeyDown': onKeyDownProp
56
110
  }
57
- })
111
+ },
112
+ labels: options,
113
+ onChange: onInput,
114
+ onKeyDown: onKeyDown,
115
+ onClickOption: onClickOption,
116
+ onFocus: onFocus,
117
+ onBlur: onBlur
58
118
  })
59
119
  });
60
120
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/CalendarTime/CalendarTimePicker.tsx"],"sourcesContent":["'use client';\n\nimport { type ChangeEvent, useState } from 'react';\nimport * as React from 'react';\nimport { AdaptivityProvider } from '../AdaptivityProvider/AdaptivityProvider';\nimport { CustomSelect, type SelectProps } from '../CustomSelect/CustomSelect';\nimport { CustomSelectOption } from '../CustomSelectOption/CustomSelectOption';\nimport styles from './CalendarTime.module.css';\n\nconst selectFilterFn = () => true;\n\nconst validateValue = (\n value: string,\n validValues: Array<{\n value: number;\n label: string;\n }>,\n): boolean => {\n const numValue = Number(value);\n return !isNaN(numValue) && validValues.some((v) => v.value === numValue);\n};\n\n/* eslint-disable jsdoc/require-jsdoc */\ninterface CalendarTimePickerProps extends Pick<SelectProps, 'onInputKeyDown'> {\n value: Date;\n getNumericValue: (date: Date) => number;\n options: Array<{\n value: number;\n label: string;\n }>;\n onChange?: ((value: Date) => void) | undefined;\n setTime: (value: Date, time: number) => Date;\n inputRef: React.Ref<HTMLInputElement>;\n inputLabel?: string | undefined;\n inputTestId?: string | undefined;\n}\n/* eslint-enable jsdoc/require-jsdoc */\n\nexport const CalendarTimePicker = ({\n value,\n getNumericValue,\n options,\n onChange,\n setTime,\n inputRef,\n inputLabel,\n inputTestId,\n onInputKeyDown,\n}: CalendarTimePickerProps) => {\n const [inputValue, setInputValue] = useState<string | undefined>(undefined);\n\n const onBlur = React.useCallback(() => {\n setInputValue(undefined);\n }, []);\n\n const _onChange = React.useCallback(\n (_: ChangeEvent<HTMLSelectElement>, newValue: SelectProps['value']) =>\n onChange?.(setTime(value, Number(newValue))),\n [onChange, setTime, value],\n );\n\n const onPickerValueChange = (e: ChangeEvent<HTMLInputElement>) => {\n const numericValue = e.target.value.replace(/\\D/g, '');\n setInputValue(numericValue);\n if (validateValue(numericValue, options)) {\n onChange?.(setTime(value, Number(numericValue)));\n }\n };\n\n return (\n <div className={styles.picker}>\n <AdaptivityProvider density=\"compact\">\n <CustomSelect\n value={getNumericValue(value)}\n options={options}\n onChange={_onChange}\n forceDropdownPortal={false}\n searchable\n filterFn={selectFilterFn}\n onInputChange={onPickerValueChange}\n onInputKeyDown={onInputKeyDown}\n renderOption={({ children: optionChildren, ...optionProps }) => (\n <CustomSelectOption {...optionProps} textNoWrap>\n {optionChildren}\n </CustomSelectOption>\n )}\n slotProps={{\n input: {\n 'aria-label': inputLabel,\n 'data-testid': inputTestId,\n 'value': inputValue,\n 'getRootRef': inputRef,\n onBlur,\n },\n }}\n />\n </AdaptivityProvider>\n </div>\n );\n};\n"],"names":["useState","React","AdaptivityProvider","CustomSelect","CustomSelectOption","selectFilterFn","validateValue","value","validValues","numValue","Number","isNaN","some","v","CalendarTimePicker","getNumericValue","options","onChange","setTime","inputRef","inputLabel","inputTestId","onInputKeyDown","inputValue","setInputValue","undefined","onBlur","useCallback","_onChange","_","newValue","onPickerValueChange","e","numericValue","target","replace","div","className","density","forceDropdownPortal","searchable","filterFn","onInputChange","renderOption","children","optionChildren","optionProps","textNoWrap","slotProps","input"],"mappings":"AAAA;;AAEA,SAA2BA,QAAQ,QAAQ,QAAQ;AACnD,YAAYC,WAAW,QAAQ;AAC/B,SAASC,kBAAkB,QAAQ,8CAA2C;AAC9E,SAASC,YAAY,QAA0B,kCAA+B;AAC9E,SAASC,kBAAkB,QAAQ,8CAA2C;AAG9E,MAAMC,iBAAiB,IAAM;AAE7B,MAAMC,gBAAgB,CACpBC,OACAC;IAKA,MAAMC,WAAWC,OAAOH;IACxB,OAAO,CAACI,MAAMF,aAAaD,YAAYI,IAAI,CAAC,CAACC,IAAMA,EAAEN,KAAK,KAAKE;AACjE;AAgBA,qCAAqC,GAErC,OAAO,MAAMK,qBAAqB,CAAC,EACjCP,KAAK,EACLQ,eAAe,EACfC,OAAO,EACPC,QAAQ,EACRC,OAAO,EACPC,QAAQ,EACRC,UAAU,EACVC,WAAW,EACXC,cAAc,EACU;IACxB,MAAM,CAACC,YAAYC,cAAc,GAAGxB,SAA6ByB;IAEjE,MAAMC,SAASzB,MAAM0B,WAAW,CAAC;QAC/BH,cAAcC;IAChB,GAAG,EAAE;IAEL,MAAMG,YAAY3B,MAAM0B,WAAW,CACjC,CAACE,GAAmCC,WAClCb,WAAWC,QAAQX,OAAOG,OAAOoB,aACnC;QAACb;QAAUC;QAASX;KAAM;IAG5B,MAAMwB,sBAAsB,CAACC;QAC3B,MAAMC,eAAeD,EAAEE,MAAM,CAAC3B,KAAK,CAAC4B,OAAO,CAAC,OAAO;QACnDX,cAAcS;QACd,IAAI3B,cAAc2B,cAAcjB,UAAU;YACxCC,WAAWC,QAAQX,OAAOG,OAAOuB;QACnC;IACF;IAEA,qBACE,KAACG;QAAIC,SAAS;kBACZ,cAAA,KAACnC;YAAmBoC,SAAQ;sBAC1B,cAAA,KAACnC;gBACCI,OAAOQ,gBAAgBR;gBACvBS,SAASA;gBACTC,UAAUW;gBACVW,qBAAqB;gBACrBC,UAAU;gBACVC,UAAUpC;gBACVqC,eAAeX;gBACfT,gBAAgBA;gBAChBqB,cAAc,CAAC,EAAEC,UAAUC,cAAc,EAAE,GAAGC,aAAa,iBACzD,KAAC1C;wBAAoB,GAAG0C,WAAW;wBAAEC,UAAU;kCAC5CF;;gBAGLG,WAAW;oBACTC,OAAO;wBACL,cAAc7B;wBACd,eAAeC;wBACf,SAASE;wBACT,cAAcJ;wBACdO;oBACF;gBACF;;;;AAKV,EAAE"}
1
+ {"version":3,"sources":["../../../src/components/CalendarTime/CalendarTimePicker.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { clamp, overflow } from '../../helpers/math';\nimport { useBooleanState } from '../../hooks/useBooleanState';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { Keys } from '../../lib/accessibility';\nimport { isActiveElement } from '../../lib/dom';\nimport { ComboBox } from './ComboBox';\nimport styles from './CalendarTime.module.css';\n\nfunction validateValueInput(event: React.ChangeEvent<HTMLInputElement>, maxValue: number) {\n if (event.target.value === '') {\n return event.target.value;\n }\n\n const inputValue = /\\d\\d?/.exec(event.target.value)?.[0] || '';\n if (event.target.value !== inputValue) {\n return inputValue;\n }\n\n const inputValueNumber = Number(inputValue);\n if (isNaN(inputValueNumber)) {\n return '';\n }\n\n const resultValueNumber = clamp(inputValueNumber, 0, maxValue);\n\n if (inputValueNumber === resultValueNumber) {\n return inputValue;\n }\n\n return resultValueNumber.toString();\n}\n\nexport function padStartTimeValue(value: Pick<string, 'toString'>): string {\n return value.toString().padStart(2, '0');\n}\n\nfunction newValueOnInputKeyDown(event: React.KeyboardEvent<HTMLInputElement>, maxValue: number) {\n if (!(event.target instanceof HTMLInputElement)) {\n return '';\n }\n\n switch (event.key) {\n case Keys.ARROW_UP:\n return padStartTimeValue(overflow(Number(event.target.value) + 1, 0, maxValue));\n case Keys.ARROW_DOWN:\n return padStartTimeValue(overflow(Number(event.target.value) - 1, 0, maxValue));\n }\n\n return event.target.value;\n}\n\n/* eslint-disable jsdoc/require-jsdoc */\ninterface CalendarTimePickerProps {\n valueDate: Date;\n options: ReadonlyArray<{\n value: string;\n label: string;\n }>;\n onChange?: ((value: Date) => void) | undefined;\n setTime: (value: Date, time: number) => Date;\n inputRef: React.Ref<HTMLInputElement>;\n inputLabel?: string | undefined;\n inputTestId?: string | undefined;\n value: number;\n maxValue: number;\n onInputEnd?: () => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n isDayDisabled?: ((day: Date, withTime?: boolean) => boolean) | undefined;\n}\n/* eslint-enable jsdoc/require-jsdoc */\n\nexport const CalendarTimePicker = ({\n valueDate,\n value,\n options,\n onChange,\n setTime,\n inputRef,\n inputLabel,\n inputTestId,\n maxValue,\n onInputEnd,\n onKeyDown: onKeyDownProp,\n isDayDisabled,\n}: CalendarTimePickerProps) => {\n const ref = useExternRef(inputRef);\n\n const [isInputFocused, onFocus, setInputBlur] = useBooleanState(false);\n\n const [editableValue, setEditableValue] = React.useState(padStartTimeValue(value));\n\n const updateValue = (newValue: string) => {\n const newDate = setTime(valueDate, Number(newValue));\n if (isDayDisabled?.(newDate, true)) {\n return;\n }\n setEditableValue(newValue);\n onChange?.(newDate);\n };\n\n // Обработка ввода\n\n const onInput = (event: React.ChangeEvent<HTMLInputElement>) => {\n const validateValue = validateValueInput(event, maxValue);\n updateValue(validateValue);\n\n if (validateValue.length > 1 && event.target.selectionStart) {\n onInputEnd?.();\n }\n };\n\n // Управление числом с клавиатуры стрелками вниз/вверх.\n\n const onKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n const validateValue = newValueOnInputKeyDown(event, maxValue);\n updateValue(validateValue);\n };\n\n // Обработка каретки если время уже задано\n\n const onSelectionChange = React.useCallback((event: Event) => {\n if (event.target instanceof HTMLInputElement) {\n if (event.target.value.length > 1 && isActiveElement(event.target)) {\n event.target.select();\n }\n }\n }, []);\n\n React.useEffect(() => {\n const el = ref.current;\n el?.addEventListener('selectionchange', onSelectionChange);\n\n return () => {\n el?.removeEventListener('selectionchange', onSelectionChange);\n };\n }, [onSelectionChange, ref]);\n\n // Обработка ухода с поля ввода\n\n const onBlur = () => {\n setInputBlur();\n setEditableValue((value) => {\n const newValue = padStartTimeValue(value);\n\n return newValue;\n });\n };\n\n // Обработка значения при нажатии в барабане\n\n const onClickOption = (newValue: string) => {\n updateValue(newValue);\n };\n\n const valueAsString = padStartTimeValue(value);\n\n const viewValue =\n isInputFocused || padStartTimeValue(editableValue) !== valueAsString\n ? editableValue\n : valueAsString;\n\n return (\n <div className={styles.picker}>\n <ComboBox\n value={viewValue}\n slotProps={{\n input: {\n 'getRootRef': ref,\n 'aria-label': inputLabel,\n 'data-testid': inputTestId,\n 'onKeyDown': onKeyDownProp,\n },\n }}\n labels={options}\n onChange={onInput}\n onKeyDown={onKeyDown}\n onClickOption={onClickOption}\n onFocus={onFocus}\n onBlur={onBlur}\n />\n </div>\n );\n};\n"],"names":["React","clamp","overflow","useBooleanState","useExternRef","Keys","isActiveElement","ComboBox","validateValueInput","event","maxValue","target","value","inputValue","exec","inputValueNumber","Number","isNaN","resultValueNumber","toString","padStartTimeValue","padStart","newValueOnInputKeyDown","HTMLInputElement","key","ARROW_UP","ARROW_DOWN","CalendarTimePicker","valueDate","options","onChange","setTime","inputRef","inputLabel","inputTestId","onInputEnd","onKeyDown","onKeyDownProp","isDayDisabled","ref","isInputFocused","onFocus","setInputBlur","editableValue","setEditableValue","useState","updateValue","newValue","newDate","onInput","validateValue","length","selectionStart","onSelectionChange","useCallback","select","useEffect","el","current","addEventListener","removeEventListener","onBlur","onClickOption","valueAsString","viewValue","div","className","slotProps","input","labels"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type InputProps } from '../Input/Input';
2
+ type Label = {
3
+ /**
4
+ * Значение.
5
+ */
6
+ value: string;
7
+ /**
8
+ * Лейбл.
9
+ */
10
+ label: string;
11
+ /**
12
+ * Disabled состояние.
13
+ */
14
+ disabled?: boolean;
15
+ };
16
+ type ComboBoxProps = InputProps & {
17
+ readonly labels?: readonly Label[] | undefined;
18
+ /**
19
+ * Нажатие на элемент.
20
+ */
21
+ onClickOption?: ((value: string) => void) | undefined;
22
+ };
23
+ export declare function ComboBox({ getRootRef, onBlur, onFocus, after, labels, defaultValue, slotProps, onClickOption, ...restProps }: ComboBoxProps): import("react/jsx-runtime").JSX.Element;
24
+ export {};
25
+ //# sourceMappingURL=ComboBox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComboBox.d.ts","sourceRoot":"","sources":["../../../src/components/CalendarTime/ComboBox.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAS,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAIxD,KAAK,KAAK,GAAG;IACX;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAqEF,KAAK,aAAa,GAAG,UAAU,GAAG;IAEhC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,GAAG,SAAS,CAAC;IAE/C;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CACvD,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EACvB,UAAU,EACV,MAAM,EACN,OAAO,EACP,KAAK,EACL,MAAW,EACX,YAAY,EACZ,SAAS,EACT,aAAa,EACb,GAAG,SAAS,EACb,EAAE,aAAa,2CAuEf"}
@@ -0,0 +1,112 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { classNames } from "@vkontakte/vkjs";
5
+ import { useBooleanState } from "../../hooks/useBooleanState.js";
6
+ import { useExternRef } from "../../hooks/useExternRef.js";
7
+ import { callMultiple } from "../../lib/callMultiple.js";
8
+ import { CustomScrollView } from "../CustomScrollView/CustomScrollView.js";
9
+ import { CustomSelectOption } from "../CustomSelectOption/CustomSelectOption.js";
10
+ import { DropdownIcon } from "../DropdownIcon/DropdownIcon.js";
11
+ import { Input } from "../Input/Input.js";
12
+ import { Popper } from "../Popper/Popper.js";
13
+ function getScrollParent(node) {
14
+ if (!(node instanceof HTMLElement)) {
15
+ return null;
16
+ }
17
+ if (node.scrollHeight > node.clientHeight) {
18
+ return node;
19
+ } else {
20
+ return getScrollParent(node.parentNode);
21
+ }
22
+ }
23
+ function Option({ option, onClickOption, selectedValue }) {
24
+ const ref = React.useRef(null);
25
+ const selected = selectedValue === option.value;
26
+ React.useEffect(()=>{
27
+ if (!selected) {
28
+ return;
29
+ }
30
+ const element = ref.current;
31
+ const scrollElement = getScrollParent(ref.current);
32
+ if (!element || !scrollElement) {
33
+ return;
34
+ }
35
+ scrollElement.scrollTo({
36
+ top: element.offsetTop - scrollElement.offsetHeight / 2 + element.offsetHeight / 2
37
+ });
38
+ }, [
39
+ selected
40
+ ]);
41
+ return /*#__PURE__*/ _jsx(CustomSelectOption, {
42
+ getRootRef: ref,
43
+ onMouseDown: (event)=>{
44
+ event.preventDefault();
45
+ },
46
+ onClick: ()=>{
47
+ onClickOption?.(option.value);
48
+ },
49
+ selected: selected,
50
+ disabled: option.disabled,
51
+ textNoWrap: true,
52
+ children: option.label
53
+ }, option.value);
54
+ }
55
+ export function ComboBox({ getRootRef, onBlur, onFocus, after, labels = [], defaultValue, slotProps, onClickOption, ...restProps }) {
56
+ const ref = useExternRef(getRootRef);
57
+ const inputRef = useExternRef(slotProps?.input?.getRootRef);
58
+ const [focus, setFocus, setBlur] = useBooleanState(false);
59
+ const [popperPlacement, setPopperPlacement] = React.useState('bottom');
60
+ const labelsElements = focus ? labels.map((option)=>{
61
+ return /*#__PURE__*/ _jsx(Option, {
62
+ onClickOption: onClickOption,
63
+ selectedValue: restProps.value,
64
+ option: option
65
+ }, option.value);
66
+ }) : undefined;
67
+ /**
68
+ * При управлении стрелками необходима правильная очередность элементов в списке.
69
+ */ if (popperPlacement.includes('top')) {
70
+ labelsElements?.reverse();
71
+ }
72
+ return /*#__PURE__*/ _jsxs(_Fragment, {
73
+ children: [
74
+ /*#__PURE__*/ _jsx(Input, {
75
+ getRootRef: ref,
76
+ className: focus ? popperPlacement.includes('top') ? "vkuiCalendarTime__inputPopUp" : "vkuiCalendarTime__inputPopDown" : '',
77
+ type: "text",
78
+ onFocus: callMultiple(setFocus, onFocus),
79
+ onBlur: callMultiple(setBlur, onBlur),
80
+ onClick: ()=>inputRef.current?.focus(),
81
+ after: after || labels && /*#__PURE__*/ _jsx(DropdownIcon, {
82
+ opened: focus
83
+ }),
84
+ slotProps: {
85
+ ...slotProps,
86
+ input: {
87
+ ...slotProps?.input,
88
+ getRootRef: inputRef
89
+ }
90
+ },
91
+ ...restProps
92
+ }),
93
+ focus && labels && /*#__PURE__*/ _jsx(Popper, {
94
+ targetRef: ref,
95
+ placement: popperPlacement,
96
+ onPlacementChange: setPopperPlacement,
97
+ className: classNames("vkuiCalendarTime__popper", popperPlacement.includes('top') ? "vkuiCalendarTime__popperTop" : "vkuiCalendarTime__popperBottom"),
98
+ sameWidth: true,
99
+ autoUpdateOnTargetResize: true,
100
+ flipMiddlewareFallbackAxisSideDirection: "none",
101
+ offsetByMainAxis: 0,
102
+ children: /*#__PURE__*/ _jsx(CustomScrollView, {
103
+ tabIndex: -1,
104
+ className: "vkuiCalendarTime__customScroll",
105
+ children: labelsElements
106
+ })
107
+ })
108
+ ]
109
+ });
110
+ }
111
+
112
+ //# sourceMappingURL=ComboBox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/CalendarTime/ComboBox.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { type Placement } from '@vkontakte/vkui-floating-ui/core';\nimport { useBooleanState } from '../../hooks/useBooleanState';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { CustomScrollView } from '../CustomScrollView/CustomScrollView';\nimport { CustomSelectOption } from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport { Input, type InputProps } from '../Input/Input';\nimport { Popper } from '../Popper/Popper';\nimport styles from './CalendarTime.module.css';\n\ntype Label = {\n /**\n * Значение.\n */\n value: string;\n /**\n * Лейбл.\n */\n label: string;\n /**\n * Disabled состояние.\n */\n disabled?: boolean;\n};\n\ntype OptionProps = {\n /**\n * Выбранное значение.\n */\n selectedValue: string | number | readonly string[] | undefined;\n /**\n * Опция.\n */\n option: Label;\n /**\n * Нажатие на элемент.\n */\n onClickOption?: ((value: string) => void) | undefined;\n};\n\nfunction getScrollParent(node: Node | null): HTMLElement | null {\n if (!(node instanceof HTMLElement)) {\n return null;\n }\n\n if (node.scrollHeight > node.clientHeight) {\n return node;\n } else {\n return getScrollParent(node.parentNode);\n }\n}\n\nfunction Option({ option, onClickOption, selectedValue }: OptionProps) {\n const ref = React.useRef<HTMLDivElement>(null);\n const selected = selectedValue === option.value;\n\n React.useEffect(() => {\n if (!selected) {\n return;\n }\n\n const element = ref.current;\n const scrollElement = getScrollParent(ref.current);\n\n if (!element || !scrollElement) {\n return;\n }\n\n scrollElement.scrollTo({\n top: element.offsetTop - scrollElement.offsetHeight / 2 + element.offsetHeight / 2,\n });\n }, [selected]);\n\n return (\n <CustomSelectOption\n getRootRef={ref}\n key={option.value}\n onMouseDown={(event) => {\n event.preventDefault();\n }}\n onClick={() => {\n onClickOption?.(option.value);\n }}\n selected={selected}\n disabled={option.disabled}\n textNoWrap\n >\n {option.label}\n </CustomSelectOption>\n );\n}\n\ntype ComboBoxProps = InputProps & {\n // eslint-disable-next-line jsdoc/require-jsdoc\n readonly labels?: readonly Label[] | undefined;\n\n /**\n * Нажатие на элемент.\n */\n onClickOption?: ((value: string) => void) | undefined;\n};\n\nexport function ComboBox({\n getRootRef,\n onBlur,\n onFocus,\n after,\n labels = [],\n defaultValue,\n slotProps,\n onClickOption,\n ...restProps\n}: ComboBoxProps) {\n const ref = useExternRef(getRootRef);\n const inputRef = useExternRef(slotProps?.input?.getRootRef);\n\n const [focus, setFocus, setBlur] = useBooleanState(false);\n\n const [popperPlacement, setPopperPlacement] = React.useState<Placement>('bottom');\n\n const labelsElements = focus\n ? labels.map((option) => {\n return (\n <Option\n key={option.value}\n onClickOption={onClickOption}\n selectedValue={restProps.value}\n option={option}\n />\n );\n })\n : undefined;\n\n /**\n * При управлении стрелками необходима правильная очередность элементов в списке.\n */\n if (popperPlacement.includes('top')) {\n labelsElements?.reverse();\n }\n\n return (\n <>\n <Input\n getRootRef={ref}\n className={\n focus ? (popperPlacement.includes('top') ? styles.inputPopUp : styles.inputPopDown) : ''\n }\n type=\"text\"\n onFocus={callMultiple(setFocus, onFocus)}\n onBlur={callMultiple(setBlur, onBlur)}\n onClick={() => inputRef.current?.focus()}\n after={after || (labels && <DropdownIcon opened={focus} />)}\n slotProps={{\n ...slotProps,\n input: {\n ...slotProps?.input,\n getRootRef: inputRef,\n },\n }}\n {...restProps}\n />\n\n {focus && labels && (\n <Popper\n targetRef={ref}\n placement={popperPlacement}\n onPlacementChange={setPopperPlacement}\n className={classNames(\n styles.popper,\n popperPlacement.includes('top') ? styles.popperTop : styles.popperBottom,\n )}\n sameWidth\n autoUpdateOnTargetResize\n flipMiddlewareFallbackAxisSideDirection=\"none\"\n offsetByMainAxis={0}\n >\n <CustomScrollView tabIndex={-1} className={styles.customScroll}>\n {labelsElements}\n </CustomScrollView>\n </Popper>\n )}\n </>\n );\n}\n"],"names":["React","classNames","useBooleanState","useExternRef","callMultiple","CustomScrollView","CustomSelectOption","DropdownIcon","Input","Popper","getScrollParent","node","HTMLElement","scrollHeight","clientHeight","parentNode","Option","option","onClickOption","selectedValue","ref","useRef","selected","value","useEffect","element","current","scrollElement","scrollTo","top","offsetTop","offsetHeight","getRootRef","onMouseDown","event","preventDefault","onClick","disabled","textNoWrap","label","ComboBox","onBlur","onFocus","after","labels","defaultValue","slotProps","restProps","inputRef","input","focus","setFocus","setBlur","popperPlacement","setPopperPlacement","useState","labelsElements","map","undefined","includes","reverse","className","type","opened","targetRef","placement","onPlacementChange","sameWidth","autoUpdateOnTargetResize","flipMiddlewareFallbackAxisSideDirection","offsetByMainAxis","tabIndex"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CardScroll.d.ts","sourceRoot":"","sources":["../../../src/components/CardScroll/CardScroll.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAUpG,MAAM,WAAW,eACf,SAAQ,yBAAyB,CAAC,cAAc,CAAC,EAC/C,YAAY,EACZ,IAAI,CAAC,qBAAqB,EAAE,YAAY,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;IACrF;;OAEG;IACH,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,SAAS,CAAC;IAC3C;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B;;OAEG;IACH,kBAAkB,CAAC,EAAE,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;CACpD;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,+GASxB,eAAe,KAAG,KAAK,CAAC,SAmG1B,CAAC"}
1
+ {"version":3,"file":"CardScroll.d.ts","sourceRoot":"","sources":["../../../src/components/CardScroll/CardScroll.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,KAAK,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAUpG,MAAM,WAAW,eACf,SAAQ,yBAAyB,CAAC,cAAc,CAAC,EAC/C,YAAY,EACZ,IAAI,CAAC,qBAAqB,EAAE,YAAY,GAAG,kBAAkB,GAAG,kBAAkB,CAAC;IACrF;;OAEG;IACH,IAAI,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,SAAS,CAAC;IAC3C;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B;;OAEG;IACH,kBAAkB,CAAC,EAAE,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC;CACpD;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,+GASxB,eAAe,KAAG,KAAK,CAAC,SAqG1B,CAAC"}
@@ -3,7 +3,6 @@ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
4
  import { classNames } from "@vkontakte/vkjs";
5
5
  import { useConfigDirection } from "../../hooks/useConfigDirection.js";
6
- import { useDOM } from "../../lib/dom.js";
7
6
  import { HorizontalScroll } from "../HorizontalScroll/HorizontalScroll.js";
8
7
  import { RootComponent } from "../RootComponent/RootComponent.js";
9
8
  const stylesSize = {
@@ -16,8 +15,8 @@ const stylesSize = {
16
15
  */ export const CardScroll = ({ children, size = 's', showArrows = true, padding = false, CardsListComponent = 'ul', prevButtonTestId, nextButtonTestId, ...restProps })=>{
17
16
  const refContainer = React.useRef(null);
18
17
  const direction = useConfigDirection();
19
- const { window } = useDOM();
20
18
  const getPadding = (container)=>{
19
+ const window = container.ownerDocument.defaultView;
21
20
  return parseFloat(window.getComputedStyle(container).getPropertyValue('--vkui_internal--CardScroll_horizontal_padding'));
22
21
  };
23
22
  const slideOffsetFromStart = (slide)=>{
@@ -30,6 +29,7 @@ const stylesSize = {
30
29
  }
31
30
  const containerWidth = refContainer.current.offsetWidth;
32
31
  const getMarginEnd = (el)=>{
32
+ const window = el.ownerDocument.defaultView;
33
33
  const computedStyles = window.getComputedStyle(el);
34
34
  return parseInt(computedStyles.marginInlineEnd) || (direction === 'rtl' ? parseInt(computedStyles.marginLeft) : parseInt(computedStyles.marginRight)) || 0;
35
35
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/CardScroll/CardScroll.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useConfigDirection } from '../../hooks/useConfigDirection';\nimport { useDOM } from '../../lib/dom';\nimport type { HasComponent, HTMLAttributesWithRootRef } from '../../types';\nimport { HorizontalScroll, type HorizontalScrollProps } from '../HorizontalScroll/HorizontalScroll';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './CardScroll.module.css';\n\nconst stylesSize = {\n s: 'vkuiInternalCardScroll--size-s',\n m: 'vkuiInternalCardScroll--size-m',\n l: 'vkuiInternalCardScroll--size-l',\n};\n\nexport interface CardScrollProps\n extends HTMLAttributesWithRootRef<HTMLDivElement>,\n HasComponent,\n Pick<HorizontalScrollProps, 'showArrows' | 'prevButtonTestId' | 'nextButtonTestId'> {\n /**\n * При `size=false` ширина `Card` будет регулироваться контентом внутри. В остальных случаях — будет явно задана в процентах.\n */\n size?: 's' | 'm' | 'l' | false | undefined;\n /**\n * Добавляет отступы по краям слева и справа.\n */\n padding?: boolean | undefined;\n /**\n * Позволяет поменять тег используемый для обертки над карточками.\n */\n CardsListComponent?: React.ElementType | undefined;\n}\n\n/**\n * @see https://vkui.io/components/card-scroll\n */\nexport const CardScroll = ({\n children,\n size = 's',\n showArrows = true,\n padding = false,\n CardsListComponent = 'ul',\n prevButtonTestId,\n nextButtonTestId,\n ...restProps\n}: CardScrollProps): React.ReactNode => {\n const refContainer = React.useRef<HTMLDivElement>(null);\n const direction = useConfigDirection();\n\n const { window } = useDOM();\n\n const getPadding = (container: HTMLElement) => {\n return parseFloat(\n window!\n .getComputedStyle(container)\n .getPropertyValue('--vkui_internal--CardScroll_horizontal_padding'),\n );\n };\n\n const slideOffsetFromStart = (slide: HTMLElement) => {\n const containerWidth = refContainer.current?.offsetWidth || 0;\n return direction === 'rtl'\n ? containerWidth - slide.offsetLeft - slide.offsetWidth\n : slide.offsetLeft;\n };\n\n function getScrollToLeft(offset: number): number {\n if (!refContainer.current) {\n return offset;\n }\n const containerWidth = refContainer.current.offsetWidth;\n\n const getMarginEnd = (el: HTMLElement) => {\n const computedStyles = window!.getComputedStyle(el);\n return (\n parseInt(computedStyles.marginInlineEnd) ||\n (direction === 'rtl'\n ? parseInt(computedStyles.marginLeft)\n : parseInt(computedStyles.marginRight)) ||\n 0\n );\n };\n\n const slideIndex = ([...refContainer.current.children] as HTMLElement[]).findIndex(\n (el: HTMLElement) =>\n slideOffsetFromStart(el) + el.offsetWidth + getMarginEnd(el) - offset >= 0,\n );\n\n if (slideIndex === -1) {\n return offset;\n }\n\n const slide = refContainer.current.children[slideIndex] as HTMLElement;\n const padding = getPadding(refContainer.current);\n const scrollTo = slideOffsetFromStart(slide) - (containerWidth - slide.offsetWidth) + padding;\n\n if (scrollTo <= 2 * padding) {\n return 0;\n }\n\n return scrollTo;\n }\n\n function getScrollToRight(offset: number): number {\n if (!refContainer.current) {\n return offset;\n }\n const containerWidth = refContainer.current.offsetWidth;\n const slide = Array.prototype.find.call(refContainer.current.children, (el: HTMLElement) => {\n return slideOffsetFromStart(el) + el.offsetWidth - offset > containerWidth;\n }) as HTMLElement;\n\n if (!slide) {\n return offset;\n }\n\n const padding = getPadding(refContainer.current);\n return slideOffsetFromStart(slide) - padding;\n }\n\n return (\n <RootComponent\n {...restProps}\n baseClassName={classNames(\n styles.host,\n 'vkuiInternalCardScroll',\n size !== false && stylesSize[size],\n padding && styles.withPaddings,\n )}\n >\n <HorizontalScroll\n getScrollToLeft={getScrollToLeft}\n getScrollToRight={getScrollToRight}\n showArrows={showArrows}\n prevButtonTestId={prevButtonTestId}\n nextButtonTestId={nextButtonTestId}\n ContentWrapperComponent={CardsListComponent}\n contentWrapperRef={refContainer}\n contentWrapperClassName={styles.in}\n >\n {children}\n </HorizontalScroll>\n </RootComponent>\n );\n};\n"],"names":["React","classNames","useConfigDirection","useDOM","HorizontalScroll","RootComponent","stylesSize","s","m","l","CardScroll","children","size","showArrows","padding","CardsListComponent","prevButtonTestId","nextButtonTestId","restProps","refContainer","useRef","direction","window","getPadding","container","parseFloat","getComputedStyle","getPropertyValue","slideOffsetFromStart","slide","containerWidth","current","offsetWidth","offsetLeft","getScrollToLeft","offset","getMarginEnd","el","computedStyles","parseInt","marginInlineEnd","marginLeft","marginRight","slideIndex","findIndex","scrollTo","getScrollToRight","Array","prototype","find","call","baseClassName","ContentWrapperComponent","contentWrapperRef","contentWrapperClassName"],"mappings":"AAAA;;AAEA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,kBAAkB,QAAQ,oCAAiC;AACpE,SAASC,MAAM,QAAQ,mBAAgB;AAEvC,SAASC,gBAAgB,QAAoC,0CAAuC;AACpG,SAASC,aAAa,QAAQ,oCAAiC;AAG/D,MAAMC,aAAa;IACjBC,GAAG;IACHC,GAAG;IACHC,GAAG;AACL;AAoBA;;CAEC,GACD,OAAO,MAAMC,aAAa,CAAC,EACzBC,QAAQ,EACRC,OAAO,GAAG,EACVC,aAAa,IAAI,EACjBC,UAAU,KAAK,EACfC,qBAAqB,IAAI,EACzBC,gBAAgB,EAChBC,gBAAgB,EAChB,GAAGC,WACa;IAChB,MAAMC,eAAenB,MAAMoB,MAAM,CAAiB;IAClD,MAAMC,YAAYnB;IAElB,MAAM,EAAEoB,MAAM,EAAE,GAAGnB;IAEnB,MAAMoB,aAAa,CAACC;QAClB,OAAOC,WACLH,OACGI,gBAAgB,CAACF,WACjBG,gBAAgB,CAAC;IAExB;IAEA,MAAMC,uBAAuB,CAACC;QAC5B,MAAMC,iBAAiBX,aAAaY,OAAO,EAAEC,eAAe;QAC5D,OAAOX,cAAc,QACjBS,iBAAiBD,MAAMI,UAAU,GAAGJ,MAAMG,WAAW,GACrDH,MAAMI,UAAU;IACtB;IAEA,SAASC,gBAAgBC,MAAc;QACrC,IAAI,CAAChB,aAAaY,OAAO,EAAE;YACzB,OAAOI;QACT;QACA,MAAML,iBAAiBX,aAAaY,OAAO,CAACC,WAAW;QAEvD,MAAMI,eAAe,CAACC;YACpB,MAAMC,iBAAiBhB,OAAQI,gBAAgB,CAACW;YAChD,OACEE,SAASD,eAAeE,eAAe,KACtCnB,CAAAA,cAAc,QACXkB,SAASD,eAAeG,UAAU,IAClCF,SAASD,eAAeI,WAAW,CAAA,KACvC;QAEJ;QAEA,MAAMC,aAAa,AAAC;eAAIxB,aAAaY,OAAO,CAACpB,QAAQ;SAAC,CAAmBiC,SAAS,CAChF,CAACP,KACCT,qBAAqBS,MAAMA,GAAGL,WAAW,GAAGI,aAAaC,MAAMF,UAAU;QAG7E,IAAIQ,eAAe,CAAC,GAAG;YACrB,OAAOR;QACT;QAEA,MAAMN,QAAQV,aAAaY,OAAO,CAACpB,QAAQ,CAACgC,WAAW;QACvD,MAAM7B,UAAUS,WAAWJ,aAAaY,OAAO;QAC/C,MAAMc,WAAWjB,qBAAqBC,SAAUC,CAAAA,iBAAiBD,MAAMG,WAAW,AAAD,IAAKlB;QAEtF,IAAI+B,YAAY,IAAI/B,SAAS;YAC3B,OAAO;QACT;QAEA,OAAO+B;IACT;IAEA,SAASC,iBAAiBX,MAAc;QACtC,IAAI,CAAChB,aAAaY,OAAO,EAAE;YACzB,OAAOI;QACT;QACA,MAAML,iBAAiBX,aAAaY,OAAO,CAACC,WAAW;QACvD,MAAMH,QAAQkB,MAAMC,SAAS,CAACC,IAAI,CAACC,IAAI,CAAC/B,aAAaY,OAAO,CAACpB,QAAQ,EAAE,CAAC0B;YACtE,OAAOT,qBAAqBS,MAAMA,GAAGL,WAAW,GAAGG,SAASL;QAC9D;QAEA,IAAI,CAACD,OAAO;YACV,OAAOM;QACT;QAEA,MAAMrB,UAAUS,WAAWJ,aAAaY,OAAO;QAC/C,OAAOH,qBAAqBC,SAASf;IACvC;IAEA,qBACE,KAACT;QACE,GAAGa,SAAS;QACbiC,eAAelD,mCAEb,0BACAW,SAAS,SAASN,UAAU,CAACM,KAAK,EAClCE;kBAGF,cAAA,KAACV;YACC8B,iBAAiBA;YACjBY,kBAAkBA;YAClBjC,YAAYA;YACZG,kBAAkBA;YAClBC,kBAAkBA;YAClBmC,yBAAyBrC;YACzBsC,mBAAmBlC;YACnBmC,uBAAuB;sBAEtB3C;;;AAIT,EAAE"}
1
+ {"version":3,"sources":["../../../src/components/CardScroll/CardScroll.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useConfigDirection } from '../../hooks/useConfigDirection';\nimport type { HasComponent, HTMLAttributesWithRootRef } from '../../types';\nimport { HorizontalScroll, type HorizontalScrollProps } from '../HorizontalScroll/HorizontalScroll';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './CardScroll.module.css';\n\nconst stylesSize = {\n s: 'vkuiInternalCardScroll--size-s',\n m: 'vkuiInternalCardScroll--size-m',\n l: 'vkuiInternalCardScroll--size-l',\n};\n\nexport interface CardScrollProps\n extends HTMLAttributesWithRootRef<HTMLDivElement>,\n HasComponent,\n Pick<HorizontalScrollProps, 'showArrows' | 'prevButtonTestId' | 'nextButtonTestId'> {\n /**\n * При `size=false` ширина `Card` будет регулироваться контентом внутри. В остальных случаях — будет явно задана в процентах.\n */\n size?: 's' | 'm' | 'l' | false | undefined;\n /**\n * Добавляет отступы по краям слева и справа.\n */\n padding?: boolean | undefined;\n /**\n * Позволяет поменять тег используемый для обертки над карточками.\n */\n CardsListComponent?: React.ElementType | undefined;\n}\n\n/**\n * @see https://vkui.io/components/card-scroll\n */\nexport const CardScroll = ({\n children,\n size = 's',\n showArrows = true,\n padding = false,\n CardsListComponent = 'ul',\n prevButtonTestId,\n nextButtonTestId,\n ...restProps\n}: CardScrollProps): React.ReactNode => {\n const refContainer = React.useRef<HTMLDivElement>(null);\n const direction = useConfigDirection();\n\n const getPadding = (container: HTMLElement) => {\n const window = container.ownerDocument.defaultView!;\n\n return parseFloat(\n window\n .getComputedStyle(container)\n .getPropertyValue('--vkui_internal--CardScroll_horizontal_padding'),\n );\n };\n\n const slideOffsetFromStart = (slide: HTMLElement) => {\n const containerWidth = refContainer.current?.offsetWidth || 0;\n return direction === 'rtl'\n ? containerWidth - slide.offsetLeft - slide.offsetWidth\n : slide.offsetLeft;\n };\n\n function getScrollToLeft(offset: number): number {\n if (!refContainer.current) {\n return offset;\n }\n const containerWidth = refContainer.current.offsetWidth;\n\n const getMarginEnd = (el: HTMLElement) => {\n const window = el.ownerDocument.defaultView!;\n\n const computedStyles = window.getComputedStyle(el);\n return (\n parseInt(computedStyles.marginInlineEnd) ||\n (direction === 'rtl'\n ? parseInt(computedStyles.marginLeft)\n : parseInt(computedStyles.marginRight)) ||\n 0\n );\n };\n\n const slideIndex = ([...refContainer.current.children] as HTMLElement[]).findIndex(\n (el: HTMLElement) =>\n slideOffsetFromStart(el) + el.offsetWidth + getMarginEnd(el) - offset >= 0,\n );\n\n if (slideIndex === -1) {\n return offset;\n }\n\n const slide = refContainer.current.children[slideIndex] as HTMLElement;\n const padding = getPadding(refContainer.current);\n const scrollTo = slideOffsetFromStart(slide) - (containerWidth - slide.offsetWidth) + padding;\n\n if (scrollTo <= 2 * padding) {\n return 0;\n }\n\n return scrollTo;\n }\n\n function getScrollToRight(offset: number): number {\n if (!refContainer.current) {\n return offset;\n }\n const containerWidth = refContainer.current.offsetWidth;\n const slide = Array.prototype.find.call(refContainer.current.children, (el: HTMLElement) => {\n return slideOffsetFromStart(el) + el.offsetWidth - offset > containerWidth;\n }) as HTMLElement;\n\n if (!slide) {\n return offset;\n }\n\n const padding = getPadding(refContainer.current);\n return slideOffsetFromStart(slide) - padding;\n }\n\n return (\n <RootComponent\n {...restProps}\n baseClassName={classNames(\n styles.host,\n 'vkuiInternalCardScroll',\n size !== false && stylesSize[size],\n padding && styles.withPaddings,\n )}\n >\n <HorizontalScroll\n getScrollToLeft={getScrollToLeft}\n getScrollToRight={getScrollToRight}\n showArrows={showArrows}\n prevButtonTestId={prevButtonTestId}\n nextButtonTestId={nextButtonTestId}\n ContentWrapperComponent={CardsListComponent}\n contentWrapperRef={refContainer}\n contentWrapperClassName={styles.in}\n >\n {children}\n </HorizontalScroll>\n </RootComponent>\n );\n};\n"],"names":["React","classNames","useConfigDirection","HorizontalScroll","RootComponent","stylesSize","s","m","l","CardScroll","children","size","showArrows","padding","CardsListComponent","prevButtonTestId","nextButtonTestId","restProps","refContainer","useRef","direction","getPadding","container","window","ownerDocument","defaultView","parseFloat","getComputedStyle","getPropertyValue","slideOffsetFromStart","slide","containerWidth","current","offsetWidth","offsetLeft","getScrollToLeft","offset","getMarginEnd","el","computedStyles","parseInt","marginInlineEnd","marginLeft","marginRight","slideIndex","findIndex","scrollTo","getScrollToRight","Array","prototype","find","call","baseClassName","ContentWrapperComponent","contentWrapperRef","contentWrapperClassName"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CarouselBase.d.ts","sourceRoot":"","sources":["../../../src/components/CarouselBase/CarouselBase.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAmC/B,OAAO,KAAK,EACV,gBAAgB,EAIjB,MAAM,SAAS,CAAC;AAKjB,eAAO,MAAM,YAAY,GAAI,gdAmC1B,gBAAgB,KAAG,KAAK,CAAC,SAmhB3B,CAAC"}
1
+ {"version":3,"file":"CarouselBase.d.ts","sourceRoot":"","sources":["../../../src/components/CarouselBase/CarouselBase.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAmC/B,OAAO,KAAK,EACV,gBAAgB,EAIjB,MAAM,SAAS,CAAC;AAKjB,eAAO,MAAM,YAAY,GAAI,gdAmC1B,gBAAgB,KAAG,KAAK,CAAC,SAohB3B,CAAC"}
@@ -286,7 +286,8 @@ export const CarouselBase = ({ bullets = false, getRootRef, children, slideWidth
286
286
  canSlideLeft: calculateCanSlideLeft(),
287
287
  canSlideRight: calculateCanSlideRight()
288
288
  }));
289
- }, [
289
+ }, // eslint-disable-next-line react-hooks/exhaustive-deps
290
+ [
290
291
  slideIndex
291
292
  ]);
292
293
  useIsomorphicLayoutEffect(function updateIsDraggable() {
@@ -298,6 +299,7 @@ export const CarouselBase = ({ bullets = false, getRootRef, children, slideWidth
298
299
  dragDisabled
299
300
  ]);
300
301
  useMutationObserver(layerRef, initializeSlides);
302
+ // eslint-disable-next-line react-hooks/exhaustive-deps
301
303
  useIsomorphicLayoutEffect(initializeSlides, [
302
304
  align,
303
305
  slideWidth,