@vkontakte/vkui 8.1.3 → 8.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (628) 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/Banner/Banner.d.ts.map +1 -1
  17. package/dist/components/Banner/Banner.js +7 -1
  18. package/dist/components/Banner/Banner.js.map +1 -1
  19. package/dist/components/Calendar/Calendar.d.ts +1 -1
  20. package/dist/components/Calendar/Calendar.js +2 -1
  21. package/dist/components/Calendar/Calendar.js.map +1 -1
  22. package/dist/components/CalendarDay/CalendarDay.d.ts.map +1 -1
  23. package/dist/components/CalendarDay/CalendarDay.js +4 -2
  24. package/dist/components/CalendarDay/CalendarDay.js.map +1 -1
  25. package/dist/components/CalendarDays/CalendarDays.d.ts.map +1 -1
  26. package/dist/components/CalendarDays/CalendarDays.js +2 -2
  27. package/dist/components/CalendarDays/CalendarDays.js.map +1 -1
  28. package/dist/components/CalendarHeader/CalendarHeader.d.ts.map +1 -1
  29. package/dist/components/CalendarHeader/CalendarHeader.js +4 -2
  30. package/dist/components/CalendarHeader/CalendarHeader.js.map +1 -1
  31. package/dist/components/CalendarRange/CalendarRange.d.ts +2 -2
  32. package/dist/components/CalendarRange/CalendarRange.js.map +1 -1
  33. package/dist/components/CalendarTime/CalendarTime.d.ts +1 -1
  34. package/dist/components/CalendarTime/CalendarTime.d.ts.map +1 -1
  35. package/dist/components/CalendarTime/CalendarTime.js +61 -50
  36. package/dist/components/CalendarTime/CalendarTime.js.map +1 -1
  37. package/dist/components/CalendarTime/CalendarTimePicker.d.ts +11 -7
  38. package/dist/components/CalendarTime/CalendarTimePicker.d.ts.map +1 -1
  39. package/dist/components/CalendarTime/CalendarTimePicker.js +108 -48
  40. package/dist/components/CalendarTime/CalendarTimePicker.js.map +1 -1
  41. package/dist/components/CalendarTime/ComboBox.d.ts +25 -0
  42. package/dist/components/CalendarTime/ComboBox.d.ts.map +1 -0
  43. package/dist/components/CalendarTime/ComboBox.js +112 -0
  44. package/dist/components/CalendarTime/ComboBox.js.map +1 -0
  45. package/dist/components/CardScroll/CardScroll.d.ts.map +1 -1
  46. package/dist/components/CardScroll/CardScroll.js +2 -2
  47. package/dist/components/CardScroll/CardScroll.js.map +1 -1
  48. package/dist/components/CarouselBase/CarouselBase.d.ts.map +1 -1
  49. package/dist/components/CarouselBase/CarouselBase.js +3 -1
  50. package/dist/components/CarouselBase/CarouselBase.js.map +1 -1
  51. package/dist/components/ChipsSelect/useChipsSelect.d.ts.map +1 -1
  52. package/dist/components/ChipsSelect/useChipsSelect.js +2 -1
  53. package/dist/components/ChipsSelect/useChipsSelect.js.map +1 -1
  54. package/dist/components/ConfigProvider/ConfigProvider.d.ts.map +1 -1
  55. package/dist/components/ConfigProvider/ConfigProvider.js +8 -4
  56. package/dist/components/ConfigProvider/ConfigProvider.js.map +1 -1
  57. package/dist/components/ConfigProvider/ConfigProviderOverride.d.ts.map +1 -1
  58. package/dist/components/ConfigProvider/ConfigProviderOverride.js +5 -1
  59. package/dist/components/ConfigProvider/ConfigProviderOverride.js.map +1 -1
  60. package/dist/components/ConfigProvider/ConfigProviderSubContexts.d.ts +15 -0
  61. package/dist/components/ConfigProvider/ConfigProviderSubContexts.d.ts.map +1 -0
  62. package/dist/components/ConfigProvider/ConfigProviderSubContexts.js +25 -0
  63. package/dist/components/ConfigProvider/ConfigProviderSubContexts.js.map +1 -0
  64. package/dist/components/ContentBadge/ContentBadge.d.ts +14 -1
  65. package/dist/components/ContentBadge/ContentBadge.d.ts.map +1 -1
  66. package/dist/components/ContentBadge/ContentBadge.js +39 -1
  67. package/dist/components/ContentBadge/ContentBadge.js.map +1 -1
  68. package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  69. package/dist/components/CustomSelect/CustomSelect.js +16 -10
  70. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  71. package/dist/components/DateInput/DateInput.d.ts.map +1 -1
  72. package/dist/components/DateInput/DateInput.js +4 -3
  73. package/dist/components/DateInput/DateInput.js.map +1 -1
  74. package/dist/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  75. package/dist/components/DateRangeInput/DateRangeInput.js +2 -2
  76. package/dist/components/DateRangeInput/DateRangeInput.js.map +1 -1
  77. package/dist/components/Epic/ScrollSaver.d.ts.map +1 -1
  78. package/dist/components/Epic/ScrollSaver.js +1 -0
  79. package/dist/components/Epic/ScrollSaver.js.map +1 -1
  80. package/dist/components/FixedLayout/ParentWidthWrapper.d.ts +6 -0
  81. package/dist/components/FixedLayout/ParentWidthWrapper.d.ts.map +1 -0
  82. package/dist/components/FixedLayout/ParentWidthWrapper.js +43 -0
  83. package/dist/components/FixedLayout/ParentWidthWrapper.js.map +1 -0
  84. package/dist/components/Flex/Flex.d.ts +7 -4
  85. package/dist/components/Flex/Flex.d.ts.map +1 -1
  86. package/dist/components/Flex/Flex.js +5 -2
  87. package/dist/components/Flex/Flex.js.map +1 -1
  88. package/dist/components/ImageBase/ImageBaseFloatElement/ImageBaseFloatElement.js +3 -1
  89. package/dist/components/ImageBase/ImageBaseFloatElement/ImageBaseFloatElement.js.map +1 -1
  90. package/dist/components/NativeSelect/NativeSelect.d.ts.map +1 -1
  91. package/dist/components/NativeSelect/NativeSelect.js +6 -2
  92. package/dist/components/NativeSelect/NativeSelect.js.map +1 -1
  93. package/dist/components/OnboardingTooltip/OnboardingTooltip.js +2 -1
  94. package/dist/components/OnboardingTooltip/OnboardingTooltip.js.map +1 -1
  95. package/dist/components/PanelHeader/PanelHeader.d.ts +1 -1
  96. package/dist/components/PanelHeader/PanelHeader.js.map +1 -1
  97. package/dist/components/Popper/Popper.js +1 -1
  98. package/dist/components/Popper/Popper.js.map +1 -1
  99. package/dist/components/PullToRefresh/PullToRefresh.d.ts.map +1 -1
  100. package/dist/components/PullToRefresh/PullToRefresh.js +8 -4
  101. package/dist/components/PullToRefresh/PullToRefresh.js.map +1 -1
  102. package/dist/components/Root/Root.d.ts +1 -1
  103. package/dist/components/Root/Root.d.ts.map +1 -1
  104. package/dist/components/Root/Root.js +14 -5
  105. package/dist/components/Root/Root.js.map +1 -1
  106. package/dist/components/SimpleGrid/SimpleGrid.d.ts +9 -8
  107. package/dist/components/SimpleGrid/SimpleGrid.d.ts.map +1 -1
  108. package/dist/components/SimpleGrid/SimpleGrid.js +9 -2
  109. package/dist/components/SimpleGrid/SimpleGrid.js.map +1 -1
  110. package/dist/components/Skeleton/Skeleton.d.ts.map +1 -1
  111. package/dist/components/Skeleton/Skeleton.js +3 -4
  112. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  113. package/dist/components/Snackbar/Snackbar.d.ts.map +1 -1
  114. package/dist/components/Snackbar/Snackbar.js +6 -3
  115. package/dist/components/Snackbar/Snackbar.js.map +1 -1
  116. package/dist/components/Spacing/Spacing.d.ts +1 -1
  117. package/dist/components/Spacing/Spacing.js.map +1 -1
  118. package/dist/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.d.ts +10 -0
  119. package/dist/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.d.ts.map +1 -0
  120. package/dist/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.js +54 -0
  121. package/dist/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.js.map +1 -0
  122. package/dist/components/Spinner/ExpressiveSpinner/icons.d.ts +18 -0
  123. package/dist/components/Spinner/ExpressiveSpinner/icons.d.ts.map +1 -0
  124. package/dist/components/Spinner/ExpressiveSpinner/icons.js +79 -0
  125. package/dist/components/Spinner/ExpressiveSpinner/icons.js.map +1 -0
  126. package/dist/components/Spinner/SvgIcon.d.ts +14 -0
  127. package/dist/components/Spinner/SvgIcon.d.ts.map +1 -0
  128. package/dist/components/Spinner/SvgIcon.js +20 -0
  129. package/dist/components/Spinner/SvgIcon.js.map +1 -0
  130. package/dist/components/Spinner/icons.d.ts +1 -1
  131. package/dist/components/Spinner/icons.d.ts.map +1 -1
  132. package/dist/components/Spinner/icons.js +10 -23
  133. package/dist/components/Spinner/icons.js.map +1 -1
  134. package/dist/components/SplitLayout/SplitLayout.d.ts +3 -3
  135. package/dist/components/SplitLayout/SplitLayout.js.map +1 -1
  136. package/dist/components/TabsItem/TabsItem.d.ts.map +1 -1
  137. package/dist/components/TabsItem/TabsItem.js +2 -5
  138. package/dist/components/TabsItem/TabsItem.js.map +1 -1
  139. package/dist/components/Tappable/Tappable.d.ts +2 -2
  140. package/dist/components/Tappable/Tappable.js.map +1 -1
  141. package/dist/components/WriteBar/WriteBar.d.ts +15 -1
  142. package/dist/components/WriteBar/WriteBar.d.ts.map +1 -1
  143. package/dist/components/WriteBar/WriteBar.js +35 -63
  144. package/dist/components/WriteBar/WriteBar.js.map +1 -1
  145. package/dist/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.d.ts +5 -0
  146. package/dist/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.d.ts.map +1 -0
  147. package/dist/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.js +15 -0
  148. package/dist/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.js.map +1 -0
  149. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormField.d.ts +8 -0
  150. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormField.d.ts.map +1 -0
  151. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormField.js +16 -0
  152. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormField.js.map +1 -0
  153. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.d.ts +5 -0
  154. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.d.ts.map +1 -0
  155. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.js +15 -0
  156. package/dist/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.js.map +1 -0
  157. package/dist/components/WriteBar/WriteBarRoot/WriteBarRoot.d.ts +10 -0
  158. package/dist/components/WriteBar/WriteBarRoot/WriteBarRoot.d.ts.map +1 -0
  159. package/dist/components/WriteBar/WriteBarRoot/WriteBarRoot.js +16 -0
  160. package/dist/components/WriteBar/WriteBarRoot/WriteBarRoot.js.map +1 -0
  161. package/dist/components/WriteBar/WriteBarTextarea/WriteBarTextarea.d.ts +10 -0
  162. package/dist/components/WriteBar/WriteBarTextarea/WriteBarTextarea.d.ts.map +1 -0
  163. package/dist/components/WriteBar/WriteBarTextarea/WriteBarTextarea.js +39 -0
  164. package/dist/components/WriteBar/WriteBarTextarea/WriteBarTextarea.js.map +1 -0
  165. package/dist/components.css +1 -1
  166. package/dist/components.css.map +1 -1
  167. package/dist/cssm/components/ActionSheet/ActionSheet.js +2 -1
  168. package/dist/cssm/components/ActionSheet/ActionSheet.js.map +1 -1
  169. package/dist/cssm/components/ActionSheet/ActionSheet.module.css +5 -3
  170. package/dist/cssm/components/AdaptivityProvider/AdaptivityContext.js.map +1 -1
  171. package/dist/cssm/components/AdaptivityProvider/AdaptivityProvider.js +2 -2
  172. package/dist/cssm/components/AdaptivityProvider/AdaptivityProvider.js.map +1 -1
  173. package/dist/cssm/components/AppRoot/AppRoot.js +0 -6
  174. package/dist/cssm/components/AppRoot/AppRoot.js.map +1 -1
  175. package/dist/cssm/components/AppRoot/AppRootContext.js +0 -1
  176. package/dist/cssm/components/AppRoot/AppRootContext.js.map +1 -1
  177. package/dist/cssm/components/Banner/Banner.js +7 -1
  178. package/dist/cssm/components/Banner/Banner.js.map +1 -1
  179. package/dist/cssm/components/Calendar/Calendar.js +2 -1
  180. package/dist/cssm/components/Calendar/Calendar.js.map +1 -1
  181. package/dist/cssm/components/CalendarDay/CalendarDay.js +4 -2
  182. package/dist/cssm/components/CalendarDay/CalendarDay.js.map +1 -1
  183. package/dist/cssm/components/CalendarDays/CalendarDays.js +2 -2
  184. package/dist/cssm/components/CalendarDays/CalendarDays.js.map +1 -1
  185. package/dist/cssm/components/CalendarHeader/CalendarHeader.js +4 -2
  186. package/dist/cssm/components/CalendarHeader/CalendarHeader.js.map +1 -1
  187. package/dist/cssm/components/CalendarRange/CalendarRange.js.map +1 -1
  188. package/dist/cssm/components/CalendarTime/CalendarTime.js +61 -50
  189. package/dist/cssm/components/CalendarTime/CalendarTime.js.map +1 -1
  190. package/dist/cssm/components/CalendarTime/CalendarTime.module.css +38 -0
  191. package/dist/cssm/components/CalendarTime/CalendarTimePicker.js +108 -48
  192. package/dist/cssm/components/CalendarTime/CalendarTimePicker.js.map +1 -1
  193. package/dist/cssm/components/CalendarTime/ComboBox.js +113 -0
  194. package/dist/cssm/components/CalendarTime/ComboBox.js.map +1 -0
  195. package/dist/cssm/components/CardScroll/CardScroll.js +2 -2
  196. package/dist/cssm/components/CardScroll/CardScroll.js.map +1 -1
  197. package/dist/cssm/components/CarouselBase/CarouselBase.js +3 -1
  198. package/dist/cssm/components/CarouselBase/CarouselBase.js.map +1 -1
  199. package/dist/cssm/components/ChipsSelect/useChipsSelect.js +2 -1
  200. package/dist/cssm/components/ChipsSelect/useChipsSelect.js.map +1 -1
  201. package/dist/cssm/components/ConfigProvider/ConfigProvider.js +8 -4
  202. package/dist/cssm/components/ConfigProvider/ConfigProvider.js.map +1 -1
  203. package/dist/cssm/components/ConfigProvider/ConfigProviderOverride.js +5 -1
  204. package/dist/cssm/components/ConfigProvider/ConfigProviderOverride.js.map +1 -1
  205. package/dist/cssm/components/ConfigProvider/ConfigProviderSubContexts.js +25 -0
  206. package/dist/cssm/components/ConfigProvider/ConfigProviderSubContexts.js.map +1 -0
  207. package/dist/cssm/components/ContentBadge/ContentBadge.js +39 -1
  208. package/dist/cssm/components/ContentBadge/ContentBadge.js.map +1 -1
  209. package/dist/cssm/components/ContentBadge/ContentBadge.module.css +88 -90
  210. package/dist/cssm/components/CustomSelect/CustomSelect.js +16 -10
  211. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  212. package/dist/cssm/components/DateInput/DateInput.js +4 -3
  213. package/dist/cssm/components/DateInput/DateInput.js.map +1 -1
  214. package/dist/cssm/components/DateRangeInput/DateRangeInput.js +2 -2
  215. package/dist/cssm/components/DateRangeInput/DateRangeInput.js.map +1 -1
  216. package/dist/cssm/components/Epic/ScrollSaver.js +1 -0
  217. package/dist/cssm/components/Epic/ScrollSaver.js.map +1 -1
  218. package/dist/cssm/components/FixedLayout/ParentWidthWrapper.js +43 -0
  219. package/dist/cssm/components/FixedLayout/ParentWidthWrapper.js.map +1 -0
  220. package/dist/cssm/components/Flex/Flex.js +5 -2
  221. package/dist/cssm/components/Flex/Flex.js.map +1 -1
  222. package/dist/cssm/components/GridAvatar/GridAvatar.module.css +1 -1
  223. package/dist/cssm/components/ImageBase/ImageBaseFloatElement/ImageBaseFloatElement.js +3 -1
  224. package/dist/cssm/components/ImageBase/ImageBaseFloatElement/ImageBaseFloatElement.js.map +1 -1
  225. package/dist/cssm/components/NativeSelect/NativeSelect.js +6 -2
  226. package/dist/cssm/components/NativeSelect/NativeSelect.js.map +1 -1
  227. package/dist/cssm/components/OnboardingTooltip/OnboardingTooltip.js +2 -1
  228. package/dist/cssm/components/OnboardingTooltip/OnboardingTooltip.js.map +1 -1
  229. package/dist/cssm/components/PanelHeader/PanelHeader.js.map +1 -1
  230. package/dist/cssm/components/Popper/Popper.js +1 -1
  231. package/dist/cssm/components/Popper/Popper.js.map +1 -1
  232. package/dist/cssm/components/PullToRefresh/PullToRefresh.js +8 -4
  233. package/dist/cssm/components/PullToRefresh/PullToRefresh.js.map +1 -1
  234. package/dist/cssm/components/PullToRefresh/PullToRefresh.module.css +1 -1
  235. package/dist/cssm/components/Root/Root.js +14 -5
  236. package/dist/cssm/components/Root/Root.js.map +1 -1
  237. package/dist/cssm/components/SimpleGrid/SimpleGrid.js +9 -2
  238. package/dist/cssm/components/SimpleGrid/SimpleGrid.js.map +1 -1
  239. package/dist/cssm/components/Skeleton/Skeleton.js +3 -4
  240. package/dist/cssm/components/Skeleton/Skeleton.js.map +1 -1
  241. package/dist/cssm/components/Snackbar/Snackbar.js +6 -3
  242. package/dist/cssm/components/Snackbar/Snackbar.js.map +1 -1
  243. package/dist/cssm/components/Spacing/Spacing.js.map +1 -1
  244. package/dist/cssm/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.js +56 -0
  245. package/dist/cssm/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.js.map +1 -0
  246. package/dist/cssm/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.module.css +13 -0
  247. package/dist/cssm/components/Spinner/ExpressiveSpinner/icons.js +79 -0
  248. package/dist/cssm/components/Spinner/ExpressiveSpinner/icons.js.map +1 -0
  249. package/dist/cssm/components/Spinner/SvgIcon.js +20 -0
  250. package/dist/cssm/components/Spinner/SvgIcon.js.map +1 -0
  251. package/dist/cssm/components/Spinner/icons.js +10 -23
  252. package/dist/cssm/components/Spinner/icons.js.map +1 -1
  253. package/dist/cssm/components/SplitLayout/SplitLayout.js.map +1 -1
  254. package/dist/cssm/components/TabsItem/TabsItem.js +2 -5
  255. package/dist/cssm/components/TabsItem/TabsItem.js.map +1 -1
  256. package/dist/cssm/components/Tappable/Tappable.js.map +1 -1
  257. package/dist/cssm/components/WriteBar/WriteBar.js +35 -64
  258. package/dist/cssm/components/WriteBar/WriteBar.js.map +1 -1
  259. package/dist/cssm/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.js +16 -0
  260. package/dist/cssm/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.js.map +1 -0
  261. package/dist/cssm/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.module.css +12 -0
  262. package/dist/cssm/components/WriteBar/WriteBarFormField/WriteBarFormField.js +17 -0
  263. package/dist/cssm/components/WriteBar/WriteBarFormField/WriteBarFormField.js.map +1 -0
  264. package/dist/cssm/components/WriteBar/WriteBarFormField/WriteBarFormField.module.css +18 -0
  265. package/dist/cssm/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.js +16 -0
  266. package/dist/cssm/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.js.map +1 -0
  267. package/dist/cssm/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.module.css +3 -0
  268. package/dist/cssm/components/WriteBar/WriteBarRoot/WriteBarRoot.js +17 -0
  269. package/dist/cssm/components/WriteBar/WriteBarRoot/WriteBarRoot.js.map +1 -0
  270. package/dist/cssm/components/WriteBar/WriteBarRoot/WriteBarRoot.module.css +15 -0
  271. package/dist/cssm/components/WriteBar/WriteBarTextarea/WriteBarTextarea.js +40 -0
  272. package/dist/cssm/components/WriteBar/WriteBarTextarea/WriteBarTextarea.js.map +1 -0
  273. package/dist/cssm/components/WriteBar/WriteBarTextarea/WriteBarTextarea.module.css +43 -0
  274. package/dist/cssm/helpers/math.js +6 -0
  275. package/dist/cssm/helpers/math.js.map +1 -1
  276. package/dist/cssm/hoc/withPlatform.js +3 -2
  277. package/dist/cssm/hoc/withPlatform.js.map +1 -1
  278. package/dist/cssm/hooks/useAdaptivityConditionalRender/types.js.map +1 -1
  279. package/dist/cssm/hooks/useAnimationFrame.js +40 -0
  280. package/dist/cssm/hooks/useAnimationFrame.js.map +1 -0
  281. package/dist/cssm/hooks/useAutoFocus.js +4 -1
  282. package/dist/cssm/hooks/useAutoFocus.js.map +1 -1
  283. package/dist/cssm/hooks/useColorScheme.js +3 -3
  284. package/dist/cssm/hooks/useColorScheme.js.map +1 -1
  285. package/dist/cssm/hooks/useConfigDirection.js +3 -3
  286. package/dist/cssm/hooks/useConfigDirection.js.map +1 -1
  287. package/dist/cssm/hooks/useDateInput.js +1 -2
  288. package/dist/cssm/hooks/useDateInput.js.map +1 -1
  289. package/dist/cssm/hooks/useFocusTrap/useAutoFocus.js +1 -0
  290. package/dist/cssm/hooks/useFocusTrap/useAutoFocus.js.map +1 -1
  291. package/dist/cssm/hooks/useFocusTrap/useFocusTrap.js +2 -0
  292. package/dist/cssm/hooks/useFocusTrap/useFocusTrap.js.map +1 -1
  293. package/dist/cssm/hooks/useFocusVisible.js +8 -13
  294. package/dist/cssm/hooks/useFocusVisible.js.map +1 -1
  295. package/dist/cssm/hooks/useFocusWithin.js +5 -4
  296. package/dist/cssm/hooks/useFocusWithin.js.map +1 -1
  297. package/dist/cssm/hooks/useGlobalEscKeyDown.js +17 -15
  298. package/dist/cssm/hooks/useGlobalEscKeyDown.js.map +1 -1
  299. package/dist/cssm/hooks/useGlobalOnClickOutside.js +6 -2
  300. package/dist/cssm/hooks/useGlobalOnClickOutside.js.map +1 -1
  301. package/dist/cssm/hooks/useKeyboardInputTracker.js +48 -41
  302. package/dist/cssm/hooks/useKeyboardInputTracker.js.map +1 -1
  303. package/dist/cssm/hooks/useLatestRef.js +13 -0
  304. package/dist/cssm/hooks/useLatestRef.js.map +1 -0
  305. package/dist/cssm/hooks/useLocale.js +3 -3
  306. package/dist/cssm/hooks/useLocale.js.map +1 -1
  307. package/dist/cssm/hooks/useMediaQueryMatch.js +1 -0
  308. package/dist/cssm/hooks/useMediaQueryMatch.js.map +1 -1
  309. package/dist/cssm/hooks/useMutationObserver.js +3 -3
  310. package/dist/cssm/hooks/useMutationObserver.js.map +1 -1
  311. package/dist/cssm/hooks/usePlatform.js +3 -3
  312. package/dist/cssm/hooks/usePlatform.js.map +1 -1
  313. package/dist/cssm/hooks/useResizeObserver.js +4 -6
  314. package/dist/cssm/hooks/useResizeObserver.js.map +1 -1
  315. package/dist/cssm/hooks/useSyncHTMLWithBaseVKUIClasses.js +2 -1
  316. package/dist/cssm/hooks/useSyncHTMLWithBaseVKUIClasses.js.map +1 -1
  317. package/dist/cssm/hooks/useSyncHTMLWithTokens.js +3 -1
  318. package/dist/cssm/hooks/useSyncHTMLWithTokens.js.map +1 -1
  319. package/dist/cssm/hooks/useWaitTransitionFinish.js +13 -15
  320. package/dist/cssm/hooks/useWaitTransitionFinish.js.map +1 -1
  321. package/dist/cssm/index.js +1 -0
  322. package/dist/cssm/index.js.map +1 -1
  323. package/dist/cssm/lib/array.js +18 -0
  324. package/dist/cssm/lib/array.js.map +1 -0
  325. package/dist/cssm/lib/curve.js +21 -0
  326. package/dist/cssm/lib/curve.js.map +1 -0
  327. package/dist/cssm/lib/dom.js +5 -2
  328. package/dist/cssm/lib/dom.js.map +1 -1
  329. package/dist/cssm/lib/fx.js +4 -55
  330. package/dist/cssm/lib/fx.js.map +1 -1
  331. package/dist/cssm/lib/layouts/index.js.map +1 -1
  332. package/dist/cssm/lib/layouts/layoutProps.js +11 -0
  333. package/dist/cssm/lib/layouts/layoutProps.js.map +1 -1
  334. package/dist/cssm/lib/layouts/resolveLayoutProps.js +13 -11
  335. package/dist/cssm/lib/layouts/resolveLayoutProps.js.map +1 -1
  336. package/dist/cssm/lib/layouts/types.js.map +1 -1
  337. package/dist/cssm/lib/material/shapes/Shape.js +18 -0
  338. package/dist/cssm/lib/material/shapes/Shape.js.map +1 -0
  339. package/dist/cssm/lib/material/shapes/shapes.js +2250 -0
  340. package/dist/cssm/lib/material/shapes/shapes.js.map +1 -0
  341. package/dist/cssm/lib/math.js +31 -0
  342. package/dist/cssm/lib/math.js.map +1 -0
  343. package/dist/cssm/lib/svg/path/approximate.js +57 -0
  344. package/dist/cssm/lib/svg/path/approximate.js.map +1 -0
  345. package/dist/cssm/lib/svg/path/interpolate.js +121 -0
  346. package/dist/cssm/lib/svg/path/interpolate.js.map +1 -0
  347. package/dist/cssm/lib/svg/path/path.js +50 -0
  348. package/dist/cssm/lib/svg/path/path.js.map +1 -0
  349. package/dist/cssm/lib/svg/path/point.js +3 -0
  350. package/dist/cssm/lib/svg/path/point.js.map +1 -0
  351. package/dist/cssm/lib/svg/path/transform.js +110 -0
  352. package/dist/cssm/lib/svg/path/transform.js.map +1 -0
  353. package/dist/cssm/lib/tokens/useTokenClassName.js +4 -1
  354. package/dist/cssm/lib/tokens/useTokenClassName.js.map +1 -1
  355. package/dist/cssm/lib/touch/UIPanGestureRecognizer.js +2 -2
  356. package/dist/cssm/lib/touch/UIPanGestureRecognizer.js.map +1 -1
  357. package/dist/cssm/styles/layout.css +273 -0
  358. package/dist/cssm/types.js +1 -4
  359. package/dist/cssm/types.js.map +1 -1
  360. package/dist/helpers/math.d.ts +4 -0
  361. package/dist/helpers/math.d.ts.map +1 -1
  362. package/dist/helpers/math.js +6 -0
  363. package/dist/helpers/math.js.map +1 -1
  364. package/dist/hoc/withPlatform.d.ts +1 -1
  365. package/dist/hoc/withPlatform.d.ts.map +1 -1
  366. package/dist/hoc/withPlatform.js +3 -2
  367. package/dist/hoc/withPlatform.js.map +1 -1
  368. package/dist/hooks/useAdaptivityConditionalRender/types.d.ts +2 -2
  369. package/dist/hooks/useAdaptivityConditionalRender/types.js.map +1 -1
  370. package/dist/hooks/useAnimationFrame.d.ts +16 -0
  371. package/dist/hooks/useAnimationFrame.d.ts.map +1 -0
  372. package/dist/hooks/useAnimationFrame.js +40 -0
  373. package/dist/hooks/useAnimationFrame.js.map +1 -0
  374. package/dist/hooks/useAutoFocus.js +4 -1
  375. package/dist/hooks/useAutoFocus.js.map +1 -1
  376. package/dist/hooks/useColorScheme.d.ts.map +1 -1
  377. package/dist/hooks/useColorScheme.js +3 -3
  378. package/dist/hooks/useColorScheme.js.map +1 -1
  379. package/dist/hooks/useConfigDirection.d.ts.map +1 -1
  380. package/dist/hooks/useConfigDirection.js +3 -3
  381. package/dist/hooks/useConfigDirection.js.map +1 -1
  382. package/dist/hooks/useDateInput.d.ts.map +1 -1
  383. package/dist/hooks/useDateInput.js +1 -2
  384. package/dist/hooks/useDateInput.js.map +1 -1
  385. package/dist/hooks/useFocusTrap/useAutoFocus.js +1 -0
  386. package/dist/hooks/useFocusTrap/useAutoFocus.js.map +1 -1
  387. package/dist/hooks/useFocusTrap/useFocusTrap.d.ts.map +1 -1
  388. package/dist/hooks/useFocusTrap/useFocusTrap.js +2 -0
  389. package/dist/hooks/useFocusTrap/useFocusTrap.js.map +1 -1
  390. package/dist/hooks/useFocusVisible.d.ts.map +1 -1
  391. package/dist/hooks/useFocusVisible.js +8 -13
  392. package/dist/hooks/useFocusVisible.js.map +1 -1
  393. package/dist/hooks/useFocusWithin.d.ts.map +1 -1
  394. package/dist/hooks/useFocusWithin.js +5 -4
  395. package/dist/hooks/useFocusWithin.js.map +1 -1
  396. package/dist/hooks/useGlobalEscKeyDown.d.ts.map +1 -1
  397. package/dist/hooks/useGlobalEscKeyDown.js +17 -15
  398. package/dist/hooks/useGlobalEscKeyDown.js.map +1 -1
  399. package/dist/hooks/useGlobalOnClickOutside.d.ts.map +1 -1
  400. package/dist/hooks/useGlobalOnClickOutside.js +6 -2
  401. package/dist/hooks/useGlobalOnClickOutside.js.map +1 -1
  402. package/dist/hooks/useKeyboardInputTracker.d.ts +1 -19
  403. package/dist/hooks/useKeyboardInputTracker.d.ts.map +1 -1
  404. package/dist/hooks/useKeyboardInputTracker.js +48 -41
  405. package/dist/hooks/useKeyboardInputTracker.js.map +1 -1
  406. package/dist/hooks/useLatestRef.d.ts +3 -0
  407. package/dist/hooks/useLatestRef.d.ts.map +1 -0
  408. package/dist/hooks/useLatestRef.js +13 -0
  409. package/dist/hooks/useLatestRef.js.map +1 -0
  410. package/dist/hooks/useLocale.d.ts.map +1 -1
  411. package/dist/hooks/useLocale.js +3 -3
  412. package/dist/hooks/useLocale.js.map +1 -1
  413. package/dist/hooks/useMediaQueryMatch.js +1 -0
  414. package/dist/hooks/useMediaQueryMatch.js.map +1 -1
  415. package/dist/hooks/useMutationObserver.d.ts +1 -2
  416. package/dist/hooks/useMutationObserver.d.ts.map +1 -1
  417. package/dist/hooks/useMutationObserver.js +3 -3
  418. package/dist/hooks/useMutationObserver.js.map +1 -1
  419. package/dist/hooks/usePlatform.d.ts.map +1 -1
  420. package/dist/hooks/usePlatform.js +3 -3
  421. package/dist/hooks/usePlatform.js.map +1 -1
  422. package/dist/hooks/useResizeObserver.d.ts.map +1 -1
  423. package/dist/hooks/useResizeObserver.js +4 -6
  424. package/dist/hooks/useResizeObserver.js.map +1 -1
  425. package/dist/hooks/useSyncHTMLWithBaseVKUIClasses.js +2 -1
  426. package/dist/hooks/useSyncHTMLWithBaseVKUIClasses.js.map +1 -1
  427. package/dist/hooks/useSyncHTMLWithTokens.js +3 -1
  428. package/dist/hooks/useSyncHTMLWithTokens.js.map +1 -1
  429. package/dist/hooks/useWaitTransitionFinish.d.ts.map +1 -1
  430. package/dist/hooks/useWaitTransitionFinish.js +13 -15
  431. package/dist/hooks/useWaitTransitionFinish.js.map +1 -1
  432. package/dist/index.d.ts +1 -0
  433. package/dist/index.d.ts.map +1 -1
  434. package/dist/index.js +1 -0
  435. package/dist/index.js.map +1 -1
  436. package/dist/lib/array.d.ts +17 -0
  437. package/dist/lib/array.d.ts.map +1 -0
  438. package/dist/lib/array.js +18 -0
  439. package/dist/lib/array.js.map +1 -0
  440. package/dist/lib/curve.d.ts +9 -0
  441. package/dist/lib/curve.d.ts.map +1 -0
  442. package/dist/lib/curve.js +21 -0
  443. package/dist/lib/curve.js.map +1 -0
  444. package/dist/lib/dom.d.ts +2 -1
  445. package/dist/lib/dom.d.ts.map +1 -1
  446. package/dist/lib/dom.js +5 -2
  447. package/dist/lib/dom.js.map +1 -1
  448. package/dist/lib/fx.d.ts +1 -8
  449. package/dist/lib/fx.d.ts.map +1 -1
  450. package/dist/lib/fx.js +4 -55
  451. package/dist/lib/fx.js.map +1 -1
  452. package/dist/lib/layouts/index.d.ts +1 -1
  453. package/dist/lib/layouts/index.d.ts.map +1 -1
  454. package/dist/lib/layouts/index.js.map +1 -1
  455. package/dist/lib/layouts/layoutProps.d.ts +7 -0
  456. package/dist/lib/layouts/layoutProps.d.ts.map +1 -1
  457. package/dist/lib/layouts/layoutProps.js +11 -0
  458. package/dist/lib/layouts/layoutProps.js.map +1 -1
  459. package/dist/lib/layouts/resolveLayoutProps.d.ts.map +1 -1
  460. package/dist/lib/layouts/resolveLayoutProps.js +13 -11
  461. package/dist/lib/layouts/resolveLayoutProps.js.map +1 -1
  462. package/dist/lib/layouts/types.d.ts +29 -0
  463. package/dist/lib/layouts/types.d.ts.map +1 -1
  464. package/dist/lib/layouts/types.js.map +1 -1
  465. package/dist/lib/material/shapes/Shape.d.ts +8 -0
  466. package/dist/lib/material/shapes/Shape.d.ts.map +1 -0
  467. package/dist/lib/material/shapes/Shape.js +18 -0
  468. package/dist/lib/material/shapes/Shape.js.map +1 -0
  469. package/dist/lib/material/shapes/shapes.d.ts +43 -0
  470. package/dist/lib/material/shapes/shapes.d.ts.map +1 -0
  471. package/dist/lib/material/shapes/shapes.js +2250 -0
  472. package/dist/lib/material/shapes/shapes.js.map +1 -0
  473. package/dist/lib/math.d.ts +23 -0
  474. package/dist/lib/math.d.ts.map +1 -0
  475. package/dist/lib/math.js +31 -0
  476. package/dist/lib/math.js.map +1 -0
  477. package/dist/lib/svg/path/approximate.d.ts +21 -0
  478. package/dist/lib/svg/path/approximate.d.ts.map +1 -0
  479. package/dist/lib/svg/path/approximate.js +57 -0
  480. package/dist/lib/svg/path/approximate.js.map +1 -0
  481. package/dist/lib/svg/path/interpolate.d.ts +5 -0
  482. package/dist/lib/svg/path/interpolate.d.ts.map +1 -0
  483. package/dist/lib/svg/path/interpolate.js +121 -0
  484. package/dist/lib/svg/path/interpolate.js.map +1 -0
  485. package/dist/lib/svg/path/path.d.ts +48 -0
  486. package/dist/lib/svg/path/path.d.ts.map +1 -0
  487. package/dist/lib/svg/path/path.js +50 -0
  488. package/dist/lib/svg/path/path.js.map +1 -0
  489. package/dist/lib/svg/path/point.d.ts +3 -0
  490. package/dist/lib/svg/path/point.d.ts.map +1 -0
  491. package/dist/lib/svg/path/point.js +3 -0
  492. package/dist/lib/svg/path/point.js.map +1 -0
  493. package/dist/lib/svg/path/transform.d.ts +64 -0
  494. package/dist/lib/svg/path/transform.d.ts.map +1 -0
  495. package/dist/lib/svg/path/transform.js +110 -0
  496. package/dist/lib/svg/path/transform.js.map +1 -0
  497. package/dist/lib/tokens/useTokenClassName.d.ts.map +1 -1
  498. package/dist/lib/tokens/useTokenClassName.js +4 -1
  499. package/dist/lib/tokens/useTokenClassName.js.map +1 -1
  500. package/dist/lib/touch/UIPanGestureRecognizer.d.ts.map +1 -1
  501. package/dist/lib/touch/UIPanGestureRecognizer.js +2 -2
  502. package/dist/lib/touch/UIPanGestureRecognizer.js.map +1 -1
  503. package/dist/types.d.ts +9 -0
  504. package/dist/types.d.ts.map +1 -1
  505. package/dist/types.js +1 -4
  506. package/dist/types.js.map +1 -1
  507. package/dist/vkui.css +1 -1
  508. package/dist/vkui.css.map +1 -1
  509. package/package.json +7 -6
  510. package/src/components/ActionSheet/ActionSheet.module.css +5 -3
  511. package/src/components/ActionSheet/ActionSheet.module.css.d.ts.map +1 -1
  512. package/src/components/ActionSheet/ActionSheet.tsx +6 -3
  513. package/src/components/AdaptivityProvider/AdaptivityContext.tsx +3 -3
  514. package/src/components/AdaptivityProvider/AdaptivityProvider.tsx +2 -2
  515. package/src/components/AppRoot/AppRoot.tsx +1 -14
  516. package/src/components/AppRoot/AppRootContext.ts +0 -2
  517. package/src/components/Banner/Banner.tsx +8 -5
  518. package/src/components/Calendar/Calendar.tsx +2 -2
  519. package/src/components/CalendarDay/CalendarDay.tsx +4 -2
  520. package/src/components/CalendarDays/CalendarDays.tsx +2 -2
  521. package/src/components/CalendarHeader/CalendarHeader.tsx +4 -2
  522. package/src/components/CalendarRange/CalendarRange.tsx +2 -2
  523. package/src/components/CalendarTime/CalendarTime.module.css +38 -0
  524. package/src/components/CalendarTime/CalendarTime.module.css.d.ts.map +1 -1
  525. package/src/components/CalendarTime/CalendarTime.tsx +68 -55
  526. package/src/components/CalendarTime/CalendarTimePicker.tsx +148 -62
  527. package/src/components/CalendarTime/ComboBox.tsx +189 -0
  528. package/src/components/CardScroll/CardScroll.tsx +6 -5
  529. package/src/components/CarouselBase/CarouselBase.tsx +2 -1
  530. package/src/components/ChipsSelect/useChipsSelect.ts +1 -0
  531. package/src/components/ConfigProvider/ConfigProvider.tsx +6 -3
  532. package/src/components/ConfigProvider/ConfigProviderOverride.tsx +2 -1
  533. package/src/components/ConfigProvider/ConfigProviderSubContexts.tsx +43 -0
  534. package/src/components/ContentBadge/ContentBadge.module.css +84 -91
  535. package/src/components/ContentBadge/ContentBadge.module.css.d.ts.map +1 -1
  536. package/src/components/ContentBadge/ContentBadge.tsx +73 -5
  537. package/src/components/CustomSelect/CustomSelect.tsx +19 -10
  538. package/src/components/DateInput/DateInput.tsx +3 -3
  539. package/src/components/DateRangeInput/DateRangeInput.tsx +2 -2
  540. package/src/components/Epic/ScrollSaver.tsx +1 -0
  541. package/src/components/FixedLayout/ParentWidthWrapper.tsx +48 -0
  542. package/src/components/Flex/Flex.tsx +11 -6
  543. package/src/components/GridAvatar/GridAvatar.module.css +1 -1
  544. package/src/components/GridAvatar/GridAvatar.module.css.d.ts.map +1 -1
  545. package/src/components/ImageBase/ImageBaseFloatElement/ImageBaseFloatElement.tsx +1 -1
  546. package/src/components/NativeSelect/NativeSelect.tsx +4 -2
  547. package/src/components/OnboardingTooltip/OnboardingTooltip.tsx +1 -1
  548. package/src/components/PanelHeader/PanelHeader.tsx +1 -1
  549. package/src/components/Popper/Popper.tsx +1 -1
  550. package/src/components/PullToRefresh/PullToRefresh.module.css +1 -1
  551. package/src/components/PullToRefresh/PullToRefresh.tsx +10 -3
  552. package/src/components/Root/Root.tsx +10 -7
  553. package/src/components/SimpleGrid/SimpleGrid.tsx +25 -11
  554. package/src/components/Skeleton/Skeleton.tsx +6 -4
  555. package/src/components/Snackbar/Snackbar.tsx +6 -3
  556. package/src/components/Spacing/Spacing.tsx +1 -1
  557. package/src/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.module.css +13 -0
  558. package/src/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.module.css.d.ts.map +1 -0
  559. package/src/components/Spinner/ExpressiveSpinner/ExpressiveSpinner.tsx +73 -0
  560. package/src/components/Spinner/ExpressiveSpinner/icons.tsx +104 -0
  561. package/src/components/Spinner/SvgIcon.tsx +31 -0
  562. package/src/components/Spinner/icons.tsx +10 -13
  563. package/src/components/SplitLayout/SplitLayout.tsx +3 -3
  564. package/src/components/TabsItem/TabsItem.tsx +4 -5
  565. package/src/components/Tappable/Tappable.tsx +2 -2
  566. package/src/components/WriteBar/WriteBar.tsx +25 -59
  567. package/src/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.module.css +12 -0
  568. package/src/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.module.css.d.ts.map +1 -0
  569. package/src/components/WriteBar/WriteBarBeforeOrAfter/WriteBarBeforeOrAfter.tsx +20 -0
  570. package/src/components/WriteBar/WriteBarFormField/WriteBarFormField.module.css +18 -0
  571. package/src/components/WriteBar/WriteBarFormField/WriteBarFormField.module.css.d.ts.map +1 -0
  572. package/src/components/WriteBar/WriteBarFormField/WriteBarFormField.tsx +22 -0
  573. package/src/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.module.css +3 -0
  574. package/src/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.module.css.d.ts.map +1 -0
  575. package/src/components/WriteBar/WriteBarFormField/WriteBarFormFieldInlineAfter/WriteBarFormFieldInlineAfter.tsx +23 -0
  576. package/src/components/WriteBar/WriteBarRoot/WriteBarRoot.module.css +14 -0
  577. package/src/components/WriteBar/WriteBarRoot/WriteBarRoot.module.css.d.ts.map +1 -0
  578. package/src/components/WriteBar/WriteBarRoot/WriteBarRoot.tsx +31 -0
  579. package/src/components/WriteBar/WriteBarTextarea/WriteBarTextarea.module.css +42 -0
  580. package/src/components/WriteBar/WriteBarTextarea/WriteBarTextarea.module.css.d.ts.map +1 -0
  581. package/src/components/WriteBar/WriteBarTextarea/WriteBarTextarea.tsx +48 -0
  582. package/src/helpers/math.ts +8 -0
  583. package/src/hoc/withPlatform.tsx +3 -3
  584. package/src/hooks/useAdaptivityConditionalRender/types.ts +2 -2
  585. package/src/hooks/useAnimationFrame.tsx +42 -0
  586. package/src/hooks/useAutoFocus.ts +1 -1
  587. package/src/hooks/useColorScheme.ts +3 -4
  588. package/src/hooks/useConfigDirection.ts +3 -4
  589. package/src/hooks/useDateInput.ts +1 -2
  590. package/src/hooks/useFocusTrap/useAutoFocus.ts +1 -1
  591. package/src/hooks/useFocusTrap/useFocusTrap.tsx +2 -0
  592. package/src/hooks/useFocusVisible.ts +10 -18
  593. package/src/hooks/useFocusWithin.ts +26 -23
  594. package/src/hooks/useGlobalEscKeyDown.ts +12 -15
  595. package/src/hooks/useGlobalOnClickOutside.ts +5 -2
  596. package/src/hooks/useKeyboardInputTracker.ts +68 -55
  597. package/src/hooks/useLatestRef.ts +12 -0
  598. package/src/hooks/useLocale.ts +3 -4
  599. package/src/hooks/useMediaQueryMatch.ts +1 -1
  600. package/src/hooks/useMutationObserver.ts +2 -3
  601. package/src/hooks/usePlatform.ts +3 -4
  602. package/src/hooks/useResizeObserver.ts +4 -5
  603. package/src/hooks/useSyncHTMLWithBaseVKUIClasses.ts +1 -1
  604. package/src/hooks/useSyncHTMLWithTokens.ts +1 -1
  605. package/src/hooks/useWaitTransitionFinish.ts +15 -15
  606. package/src/index.ts +1 -0
  607. package/src/lib/array.ts +19 -0
  608. package/src/lib/curve.ts +36 -0
  609. package/src/lib/dom.tsx +10 -4
  610. package/src/lib/fx.ts +5 -63
  611. package/src/lib/layouts/index.ts +1 -0
  612. package/src/lib/layouts/layoutProps.ts +8 -0
  613. package/src/lib/layouts/resolveLayoutProps.ts +19 -17
  614. package/src/lib/layouts/types.ts +29 -0
  615. package/src/lib/material/shapes/Shape.tsx +17 -0
  616. package/src/lib/material/shapes/shapes.ts +329 -0
  617. package/src/lib/math.ts +37 -0
  618. package/src/lib/svg/path/approximate.ts +81 -0
  619. package/src/lib/svg/path/interpolate.ts +151 -0
  620. package/src/lib/svg/path/path.ts +102 -0
  621. package/src/lib/svg/path/point.ts +2 -0
  622. package/src/lib/svg/path/transform.ts +147 -0
  623. package/src/lib/tokens/useTokenClassName.ts +7 -5
  624. package/src/lib/touch/UIPanGestureRecognizer.ts +2 -2
  625. package/src/types.ts +16 -0
  626. package/dist/cssm/components/WriteBar/WriteBar.module.css +0 -118
  627. package/src/components/WriteBar/WriteBar.module.css +0 -116
  628. package/src/components/WriteBar/WriteBar.module.css.d.ts.map +0 -1
@@ -7,35 +7,36 @@ import { Keys, pressedKey } from "../../lib/accessibility.js";
7
7
  import { setHours, setMinutes } from "../../lib/date.js";
8
8
  import { AdaptivityProvider } from "../AdaptivityProvider/AdaptivityProvider.js";
9
9
  import { Button } from "../Button/Button.js";
10
- import { CalendarTimePicker } from "./CalendarTimePicker.js";
11
- const hours = [];
12
- for(let i = 0; i < 24; i += 1){
13
- hours.push({
14
- value: i,
15
- label: String(i).padStart(2, '0')
16
- });
17
- }
18
- const minutes = [];
19
- for(let i = 0; i < 60; i += 1){
20
- minutes.push({
21
- value: i,
22
- label: String(i).padStart(2, '0')
23
- });
10
+ import { CalendarTimePicker, padStartTimeValue } from "./CalendarTimePicker.js";
11
+ const MAX_HOURS = 23;
12
+ const MAX_MINUTES = 59;
13
+ function generateLabels(min, max) {
14
+ const array = new Array(Math.ceil(max - min + 1));
15
+ for(let i = min; i <= max; i += 1){
16
+ const value = padStartTimeValue(i);
17
+ array[i - min] = {
18
+ value,
19
+ label: value
20
+ };
21
+ }
22
+ return array;
24
23
  }
25
- export const CalendarTime = ({ value, onChange, onDoneButtonClick, changeHoursLabel, changeMinutesLabel, setHours: setHoursFn = setHours, setMinutes: setMinutesFn = setMinutes, isDayDisabled, doneButtonText = 'Готово', doneButtonDisabled = false, doneButtonShow = true, minutesTestId, hoursTestId, doneButtonTestId, DoneButton })=>{
24
+ const hours = generateLabels(0, MAX_HOURS);
25
+ const minutes = generateLabels(0, MAX_MINUTES);
26
+ export const CalendarTime = ({ value, onChange, onDoneButtonClick, changeHoursLabel, changeMinutesLabel, setHours: setHoursFn = setHours, setMinutes: setMinutesFn = setMinutes, doneButtonText = 'Готово', doneButtonDisabled = false, doneButtonShow = true, minutesTestId, hoursTestId, doneButtonTestId, DoneButton, isDayDisabled })=>{
26
27
  const hoursInputRef = useRef(null);
27
28
  const minutesInputRef = useRef(null);
28
29
  const doneButtonRef = useRef(null);
29
30
  const localHours = isDayDisabled ? hours.map((hour)=>{
30
31
  return {
31
32
  ...hour,
32
- disabled: isDayDisabled(setHoursFn(value, hour.value), true)
33
+ disabled: isDayDisabled(setHoursFn(value, Number(hour.value)), true)
33
34
  };
34
35
  }) : hours;
35
36
  const localMinutes = isDayDisabled ? minutes.map((minute)=>{
36
37
  return {
37
38
  ...minute,
38
- disabled: isDayDisabled(setMinutesFn(value, minute.value), true)
39
+ disabled: isDayDisabled(setMinutesFn(value, Number(minute.value)), true)
39
40
  };
40
41
  }) : minutes;
41
42
  const onPickerKeyDown = (e)=>{
@@ -60,14 +61,8 @@ export const CalendarTime = ({ value, onChange, onDoneButtonClick, changeHoursLa
60
61
  nextStep.current?.focus();
61
62
  }
62
63
  };
63
- const stopPropagationOfEscapeKeyboardEventWhenSelectIsOpen = React.useCallback((event, isOpen)=>{
64
- if (isOpen && event.key === 'Escape') {
65
- event.stopPropagation();
66
- }
67
- }, []);
68
- const onSelectInputKeyDown = (e, isOpen)=>{
69
- onPickerKeyDown(e);
70
- stopPropagationOfEscapeKeyboardEventWhenSelectIsOpen(e, isOpen);
64
+ const onHoursInputEnd = ()=>{
65
+ minutesInputRef.current?.focus();
71
66
  };
72
67
  const renderDoneButton = ()=>{
73
68
  const ButtonComponent = DoneButton ?? Button;
@@ -85,31 +80,47 @@ export const CalendarTime = ({ value, onChange, onDoneButtonClick, changeHoursLa
85
80
  return /*#__PURE__*/ _jsxs("div", {
86
81
  className: classNames("vkuiCalendarTime__host", !doneButtonShow && "vkuiCalendarTime__host__withoutDone"),
87
82
  children: [
88
- /*#__PURE__*/ _jsx(CalendarTimePicker, {
89
- value: value,
90
- getNumericValue: (v)=>v.getHours(),
91
- onChange: onChange,
92
- options: localHours,
93
- setTime: setHoursFn,
94
- onInputKeyDown: onSelectInputKeyDown,
95
- inputRef: hoursInputRef,
96
- inputLabel: changeHoursLabel,
97
- inputTestId: hoursTestId
98
- }),
99
- /*#__PURE__*/ _jsx("div", {
100
- className: "vkuiCalendarTime__divider",
101
- children: ":"
102
- }),
103
- /*#__PURE__*/ _jsx(CalendarTimePicker, {
104
- value: value,
105
- getNumericValue: (v)=>v.getMinutes(),
106
- onChange: onChange,
107
- options: localMinutes,
108
- setTime: setMinutesFn,
109
- onInputKeyDown: onSelectInputKeyDown,
110
- inputRef: minutesInputRef,
111
- inputLabel: changeMinutesLabel,
112
- inputTestId: minutesTestId
83
+ /*#__PURE__*/ _jsxs(AdaptivityProvider, {
84
+ density: "compact",
85
+ children: [
86
+ /*#__PURE__*/ _jsx("div", {
87
+ className: "vkuiCalendarTime__picker",
88
+ children: /*#__PURE__*/ _jsx(CalendarTimePicker, {
89
+ valueDate: value,
90
+ value: value.getHours(),
91
+ onChange: onChange,
92
+ options: localHours,
93
+ setTime: setHoursFn,
94
+ onKeyDown: onPickerKeyDown,
95
+ inputRef: hoursInputRef,
96
+ inputLabel: changeHoursLabel,
97
+ inputTestId: hoursTestId,
98
+ maxValue: MAX_HOURS,
99
+ onInputEnd: onHoursInputEnd,
100
+ isDayDisabled: isDayDisabled
101
+ })
102
+ }),
103
+ /*#__PURE__*/ _jsx("div", {
104
+ className: "vkuiCalendarTime__divider",
105
+ children: ":"
106
+ }),
107
+ /*#__PURE__*/ _jsx("div", {
108
+ className: "vkuiCalendarTime__picker",
109
+ children: /*#__PURE__*/ _jsx(CalendarTimePicker, {
110
+ valueDate: value,
111
+ value: value.getMinutes(),
112
+ onChange: onChange,
113
+ options: localMinutes,
114
+ setTime: setMinutesFn,
115
+ onKeyDown: onPickerKeyDown,
116
+ inputRef: minutesInputRef,
117
+ inputLabel: changeMinutesLabel,
118
+ inputTestId: minutesTestId,
119
+ maxValue: MAX_MINUTES,
120
+ isDayDisabled: isDayDisabled
121
+ })
122
+ })
123
+ ]
113
124
  }),
114
125
  doneButtonShow && /*#__PURE__*/ _jsx("div", {
115
126
  className: "vkuiCalendarTime__button",
@@ -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