@vkontakte/vkui 6.3.1 → 6.4.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 (243) hide show
  1. package/dist/cjs/components/ChipsInputBase/ChipsInputBase.d.ts +1 -1
  2. package/dist/cjs/components/ChipsInputBase/ChipsInputBase.d.ts.map +1 -1
  3. package/dist/cjs/components/ChipsInputBase/ChipsInputBase.js +4 -2
  4. package/dist/cjs/components/ChipsInputBase/ChipsInputBase.js.map +1 -1
  5. package/dist/cjs/components/ChipsInputBase/types.d.ts +1 -1
  6. package/dist/cjs/components/ChipsInputBase/types.d.ts.map +1 -1
  7. package/dist/cjs/components/ChipsInputBase/types.js.map +1 -1
  8. package/dist/cjs/components/ChipsSelect/ChipsSelect.js +1 -1
  9. package/dist/cjs/components/ChipsSelect/ChipsSelect.js.map +1 -1
  10. package/dist/cjs/components/Clickable/Clickable.d.ts.map +1 -1
  11. package/dist/cjs/components/Clickable/Clickable.js +4 -3
  12. package/dist/cjs/components/Clickable/Clickable.js.map +1 -1
  13. package/dist/cjs/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  14. package/dist/cjs/components/CustomSelect/CustomSelect.js +2 -3
  15. package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
  16. package/dist/cjs/components/FormField/FormField.d.ts +5 -1
  17. package/dist/cjs/components/FormField/FormField.d.ts.map +1 -1
  18. package/dist/cjs/components/FormField/FormField.js +26 -10
  19. package/dist/cjs/components/FormField/FormField.js.map +1 -1
  20. package/dist/cjs/components/ImageBase/ImageBaseOverlay/ImageBaseOverlay.d.ts.map +1 -1
  21. package/dist/cjs/components/ImageBase/ImageBaseOverlay/ImageBaseOverlay.js +4 -4
  22. package/dist/cjs/components/ImageBase/ImageBaseOverlay/ImageBaseOverlay.js.map +1 -1
  23. package/dist/cjs/components/Input/Input.d.ts +1 -1
  24. package/dist/cjs/components/Input/Input.d.ts.map +1 -1
  25. package/dist/cjs/components/Input/Input.js.map +1 -1
  26. package/dist/cjs/components/ScreenSpinner/ScreenSpinner.d.ts +20 -1
  27. package/dist/cjs/components/ScreenSpinner/ScreenSpinner.d.ts.map +1 -1
  28. package/dist/cjs/components/ScreenSpinner/ScreenSpinner.js +109 -25
  29. package/dist/cjs/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
  30. package/dist/cjs/components/Select/Select.d.ts.map +1 -1
  31. package/dist/cjs/components/Select/Select.js +2 -1
  32. package/dist/cjs/components/Select/Select.js.map +1 -1
  33. package/dist/cjs/components/Snackbar/Snackbar.d.ts +3 -1
  34. package/dist/cjs/components/Snackbar/Snackbar.d.ts.map +1 -1
  35. package/dist/cjs/components/Snackbar/Snackbar.js +4 -3
  36. package/dist/cjs/components/Snackbar/Snackbar.js.map +1 -1
  37. package/dist/cjs/components/Snackbar/types.d.ts +1 -0
  38. package/dist/cjs/components/Snackbar/types.d.ts.map +1 -1
  39. package/dist/cjs/components/Snackbar/utils.d.ts.map +1 -1
  40. package/dist/cjs/components/Snackbar/utils.js +7 -3
  41. package/dist/cjs/components/Snackbar/utils.js.map +1 -1
  42. package/dist/cjs/components/Textarea/Textarea.d.ts +1 -1
  43. package/dist/cjs/components/Textarea/Textarea.d.ts.map +1 -1
  44. package/dist/cjs/components/Textarea/Textarea.js +1 -3
  45. package/dist/cjs/components/Textarea/Textarea.js.map +1 -1
  46. package/dist/cjs/components/Tooltip/Tooltip.d.ts +5 -1
  47. package/dist/cjs/components/Tooltip/Tooltip.d.ts.map +1 -1
  48. package/dist/cjs/components/Tooltip/Tooltip.js +3 -2
  49. package/dist/cjs/components/Tooltip/Tooltip.js.map +1 -1
  50. package/dist/cjs/index.d.ts +2 -2
  51. package/dist/cjs/index.d.ts.map +1 -1
  52. package/dist/cjs/index.js +3 -0
  53. package/dist/cjs/index.js.map +1 -1
  54. package/dist/cjs/lib/animation/useCSSKeyframesAnimationController.d.ts +9 -9
  55. package/dist/cjs/lib/animation/useCSSKeyframesAnimationController.d.ts.map +1 -1
  56. package/dist/cjs/lib/animation/useCSSKeyframesAnimationController.js +31 -52
  57. package/dist/cjs/lib/animation/useCSSKeyframesAnimationController.js.map +1 -1
  58. package/dist/cjs/lib/utils.d.ts +1 -1
  59. package/dist/cjs/lib/utils.d.ts.map +1 -1
  60. package/dist/cjs/lib/utils.js +12 -9
  61. package/dist/cjs/lib/utils.js.map +1 -1
  62. package/dist/components/ChipsInputBase/ChipsInputBase.d.ts +1 -1
  63. package/dist/components/ChipsInputBase/ChipsInputBase.d.ts.map +1 -1
  64. package/dist/components/ChipsInputBase/ChipsInputBase.js +4 -2
  65. package/dist/components/ChipsInputBase/ChipsInputBase.js.map +1 -1
  66. package/dist/components/ChipsInputBase/types.d.ts +1 -1
  67. package/dist/components/ChipsInputBase/types.d.ts.map +1 -1
  68. package/dist/components/ChipsInputBase/types.js.map +1 -1
  69. package/dist/components/ChipsSelect/ChipsSelect.js +1 -1
  70. package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
  71. package/dist/components/Clickable/Clickable.d.ts.map +1 -1
  72. package/dist/components/Clickable/Clickable.js +4 -3
  73. package/dist/components/Clickable/Clickable.js.map +1 -1
  74. package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  75. package/dist/components/CustomSelect/CustomSelect.js +2 -3
  76. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  77. package/dist/components/FormField/FormField.d.ts +5 -1
  78. package/dist/components/FormField/FormField.d.ts.map +1 -1
  79. package/dist/components/FormField/FormField.js +26 -10
  80. package/dist/components/FormField/FormField.js.map +1 -1
  81. package/dist/components/ImageBase/ImageBaseOverlay/ImageBaseOverlay.d.ts.map +1 -1
  82. package/dist/components/ImageBase/ImageBaseOverlay/ImageBaseOverlay.js +4 -4
  83. package/dist/components/ImageBase/ImageBaseOverlay/ImageBaseOverlay.js.map +1 -1
  84. package/dist/components/Input/Input.d.ts +1 -1
  85. package/dist/components/Input/Input.d.ts.map +1 -1
  86. package/dist/components/Input/Input.js.map +1 -1
  87. package/dist/components/ScreenSpinner/ScreenSpinner.d.ts +20 -1
  88. package/dist/components/ScreenSpinner/ScreenSpinner.d.ts.map +1 -1
  89. package/dist/components/ScreenSpinner/ScreenSpinner.js +99 -24
  90. package/dist/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
  91. package/dist/components/Select/Select.d.ts.map +1 -1
  92. package/dist/components/Select/Select.js +2 -1
  93. package/dist/components/Select/Select.js.map +1 -1
  94. package/dist/components/Snackbar/Snackbar.d.ts +3 -1
  95. package/dist/components/Snackbar/Snackbar.d.ts.map +1 -1
  96. package/dist/components/Snackbar/Snackbar.js +4 -3
  97. package/dist/components/Snackbar/Snackbar.js.map +1 -1
  98. package/dist/components/Snackbar/types.d.ts +1 -0
  99. package/dist/components/Snackbar/types.d.ts.map +1 -1
  100. package/dist/components/Snackbar/types.js.map +1 -1
  101. package/dist/components/Snackbar/utils.d.ts.map +1 -1
  102. package/dist/components/Snackbar/utils.js +7 -3
  103. package/dist/components/Snackbar/utils.js.map +1 -1
  104. package/dist/components/Textarea/Textarea.d.ts +1 -1
  105. package/dist/components/Textarea/Textarea.d.ts.map +1 -1
  106. package/dist/components/Textarea/Textarea.js +1 -3
  107. package/dist/components/Textarea/Textarea.js.map +1 -1
  108. package/dist/components/Tooltip/Tooltip.d.ts +5 -1
  109. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  110. package/dist/components/Tooltip/Tooltip.js +3 -2
  111. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  112. package/dist/components.css +3 -3
  113. package/dist/components.css.map +1 -1
  114. package/dist/components.js.tmp +885 -755
  115. package/dist/cssm/components/ChipsInputBase/ChipsInputBase.d.ts +1 -1
  116. package/dist/cssm/components/ChipsInputBase/ChipsInputBase.d.ts.map +1 -1
  117. package/dist/cssm/components/ChipsInputBase/ChipsInputBase.js +3 -2
  118. package/dist/cssm/components/ChipsInputBase/ChipsInputBase.js.map +1 -1
  119. package/dist/cssm/components/ChipsInputBase/types.d.ts +1 -1
  120. package/dist/cssm/components/ChipsInputBase/types.d.ts.map +1 -1
  121. package/dist/cssm/components/ChipsInputBase/types.js.map +1 -1
  122. package/dist/cssm/components/ChipsSelect/ChipsSelect.js +1 -1
  123. package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
  124. package/dist/cssm/components/Clickable/Clickable.d.ts.map +1 -1
  125. package/dist/cssm/components/Clickable/Clickable.js +4 -3
  126. package/dist/cssm/components/Clickable/Clickable.js.map +1 -1
  127. package/dist/cssm/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  128. package/dist/cssm/components/CustomSelect/CustomSelect.js +2 -3
  129. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  130. package/dist/cssm/components/DateInput/DateInput.module.css +1 -0
  131. package/dist/cssm/components/DateRangeInput/DateRangeInput.module.css +1 -0
  132. package/dist/cssm/components/FormField/FormField.d.ts +5 -1
  133. package/dist/cssm/components/FormField/FormField.d.ts.map +1 -1
  134. package/dist/cssm/components/FormField/FormField.js +24 -9
  135. package/dist/cssm/components/FormField/FormField.js.map +1 -1
  136. package/dist/cssm/components/FormField/FormField.module.css +27 -4
  137. package/dist/cssm/components/ImageBase/ImageBaseOverlay/ImageBaseOverlay.d.ts.map +1 -1
  138. package/dist/cssm/components/ImageBase/ImageBaseOverlay/ImageBaseOverlay.js +2 -3
  139. package/dist/cssm/components/ImageBase/ImageBaseOverlay/ImageBaseOverlay.js.map +1 -1
  140. package/dist/cssm/components/Input/Input.d.ts +1 -1
  141. package/dist/cssm/components/Input/Input.d.ts.map +1 -1
  142. package/dist/cssm/components/Input/Input.js.map +1 -1
  143. package/dist/cssm/components/List/List.module.css +1 -0
  144. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.d.ts +20 -1
  145. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.d.ts.map +1 -1
  146. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.js +86 -18
  147. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
  148. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.module.css +14 -16
  149. package/dist/cssm/components/Select/Select.d.ts.map +1 -1
  150. package/dist/cssm/components/Select/Select.js +1 -1
  151. package/dist/cssm/components/Select/Select.js.map +1 -1
  152. package/dist/cssm/components/Select/Select.module.css +1 -0
  153. package/dist/cssm/components/Snackbar/Snackbar.d.ts +3 -1
  154. package/dist/cssm/components/Snackbar/Snackbar.d.ts.map +1 -1
  155. package/dist/cssm/components/Snackbar/Snackbar.js +4 -3
  156. package/dist/cssm/components/Snackbar/Snackbar.js.map +1 -1
  157. package/dist/cssm/components/Snackbar/Snackbar.module.css +14 -1
  158. package/dist/cssm/components/Snackbar/types.d.ts +1 -0
  159. package/dist/cssm/components/Snackbar/types.d.ts.map +1 -1
  160. package/dist/cssm/components/Snackbar/types.js.map +1 -1
  161. package/dist/cssm/components/Snackbar/utils.d.ts.map +1 -1
  162. package/dist/cssm/components/Snackbar/utils.js +7 -3
  163. package/dist/cssm/components/Snackbar/utils.js.map +1 -1
  164. package/dist/cssm/components/Textarea/Textarea.d.ts +1 -1
  165. package/dist/cssm/components/Textarea/Textarea.d.ts.map +1 -1
  166. package/dist/cssm/components/Textarea/Textarea.js +1 -3
  167. package/dist/cssm/components/Textarea/Textarea.js.map +1 -1
  168. package/dist/cssm/components/Tooltip/Tooltip.d.ts +5 -1
  169. package/dist/cssm/components/Tooltip/Tooltip.d.ts.map +1 -1
  170. package/dist/cssm/components/Tooltip/Tooltip.js +2 -2
  171. package/dist/cssm/components/Tooltip/Tooltip.js.map +1 -1
  172. package/dist/cssm/index.d.ts +2 -2
  173. package/dist/cssm/index.d.ts.map +1 -1
  174. package/dist/cssm/index.js +1 -1
  175. package/dist/cssm/index.js.map +1 -1
  176. package/dist/cssm/lib/animation/useCSSKeyframesAnimationController.d.ts +9 -9
  177. package/dist/cssm/lib/animation/useCSSKeyframesAnimationController.d.ts.map +1 -1
  178. package/dist/cssm/lib/animation/useCSSKeyframesAnimationController.js +31 -51
  179. package/dist/cssm/lib/animation/useCSSKeyframesAnimationController.js.map +1 -1
  180. package/dist/cssm/lib/utils.d.ts +1 -1
  181. package/dist/cssm/lib/utils.d.ts.map +1 -1
  182. package/dist/cssm/lib/utils.js +15 -7
  183. package/dist/cssm/lib/utils.js.map +1 -1
  184. package/dist/index.d.ts +2 -2
  185. package/dist/index.d.ts.map +1 -1
  186. package/dist/index.js +1 -1
  187. package/dist/index.js.map +1 -1
  188. package/dist/lib/animation/useCSSKeyframesAnimationController.d.ts +9 -9
  189. package/dist/lib/animation/useCSSKeyframesAnimationController.d.ts.map +1 -1
  190. package/dist/lib/animation/useCSSKeyframesAnimationController.js +31 -51
  191. package/dist/lib/animation/useCSSKeyframesAnimationController.js.map +1 -1
  192. package/dist/lib/utils.d.ts +1 -1
  193. package/dist/lib/utils.d.ts.map +1 -1
  194. package/dist/lib/utils.js +16 -7
  195. package/dist/lib/utils.js.map +1 -1
  196. package/dist/vkui.css +3 -3
  197. package/dist/vkui.css.map +1 -1
  198. package/dist/vkui.js.tmp +885 -755
  199. package/package.json +3 -3
  200. package/src/components/ChipsInputBase/ChipsInputBase.tsx +3 -1
  201. package/src/components/ChipsInputBase/types.ts +1 -1
  202. package/src/components/ChipsSelect/ChipsSelect.tsx +1 -1
  203. package/src/components/Clickable/Clickable.tsx +16 -13
  204. package/src/components/CustomSelect/CustomSelect.tsx +2 -3
  205. package/src/components/DateInput/DateInput.module.css +1 -0
  206. package/src/components/DateRangeInput/DateRangeInput.module.css +1 -0
  207. package/src/components/FormField/FormField.module.css +26 -4
  208. package/src/components/FormField/FormField.tsx +31 -16
  209. package/src/components/ImageBase/ImageBaseOverlay/ImageBaseOverlay.tsx +2 -3
  210. package/src/components/Input/Input.tsx +1 -1
  211. package/src/components/List/List.module.css +1 -0
  212. package/src/components/ScreenSpinner/ScreenSpinner.module.css +14 -16
  213. package/src/components/ScreenSpinner/ScreenSpinner.tsx +132 -40
  214. package/src/components/Select/Select.module.css +1 -0
  215. package/src/components/Select/Select.tsx +1 -0
  216. package/src/components/Snackbar/Snackbar.module.css +14 -1
  217. package/src/components/Snackbar/Snackbar.tsx +17 -4
  218. package/src/components/Snackbar/types.ts +1 -0
  219. package/src/components/Snackbar/utils.ts +12 -4
  220. package/src/components/Textarea/Textarea.tsx +1 -2
  221. package/src/components/Tooltip/Tooltip.tsx +6 -1
  222. package/src/index.ts +5 -2
  223. package/src/lib/animation/useCSSKeyframesAnimationController.ts +46 -62
  224. package/src/lib/utils.ts +18 -9
  225. package/dist/cjs/components/Clickable/useKeyboard.d.ts +0 -5
  226. package/dist/cjs/components/Clickable/useKeyboard.d.ts.map +0 -1
  227. package/dist/cjs/components/Clickable/useKeyboard.js +0 -29
  228. package/dist/cjs/components/Clickable/useKeyboard.js.map +0 -1
  229. package/dist/cjs/vkui.js +0 -8
  230. package/dist/cjs/vkui.js.map +0 -1
  231. package/dist/components/Clickable/useKeyboard.d.ts +0 -5
  232. package/dist/components/Clickable/useKeyboard.d.ts.map +0 -1
  233. package/dist/components/Clickable/useKeyboard.js +0 -24
  234. package/dist/components/Clickable/useKeyboard.js.map +0 -1
  235. package/dist/cssm/components/Clickable/useKeyboard.d.ts +0 -5
  236. package/dist/cssm/components/Clickable/useKeyboard.d.ts.map +0 -1
  237. package/dist/cssm/components/Clickable/useKeyboard.js +0 -23
  238. package/dist/cssm/components/Clickable/useKeyboard.js.map +0 -1
  239. package/dist/cssm/vkui.js +0 -3
  240. package/dist/cssm/vkui.js.map +0 -1
  241. package/dist/vkui.js +0 -3
  242. package/dist/vkui.js.map +0 -1
  243. package/src/components/Clickable/useKeyboard.tsx +0 -26
@@ -49,8 +49,10 @@ export interface SnackbarProps
49
49
  * > Note: в мобильном режиме:
50
50
  * > - `"top-start"`/`"top-end"` перебивается на `"top"`, чтобы поведение было схожим с нативными
51
51
  * > уведомлениями;
52
- * > - `"bottom"`/`"bottom-end"` перебивается на "bottom-start", чтобы избежать вызова системных
52
+ * > - `"bottom"` перебивается на `"bottom-start"`, чтобы избежать вызова системных
53
53
  * > функций, таких как **Pull To Refresh** и **Режим управления одной рукой**.
54
+ * > - `"bottom-start"`/`"bottom-end"` закрываются смахиванием в любое из направлений
55
+ * > по горизонтальной оси.
54
56
  */
55
57
  placement?: SnackbarPlacement;
56
58
  /**
@@ -126,7 +128,7 @@ export const Snackbar: React.FC<SnackbarProps> & { Basic: typeof Basic } = ({
126
128
  }, []);
127
129
 
128
130
  const updateShiftAxisCSSProperties = React.useCallback(
129
- (x: number | null, y: number | null) => {
131
+ (x: number | null, y: number | null, direction: number | null) => {
130
132
  rafRef.current = requestAnimationFrame(() => {
131
133
  if (rootRef.current) {
132
134
  x === null
@@ -135,6 +137,13 @@ export const Snackbar: React.FC<SnackbarProps> & { Basic: typeof Basic } = ({
135
137
  y === null
136
138
  ? rootRef.current.style.removeProperty('--vkui_internal--snackbar_shift_y')
137
139
  : rootRef.current.style.setProperty('--vkui_internal--snackbar_shift_y', `${y}px`);
140
+ direction === null
141
+ ? rootRef.current.style.removeProperty('--vkui_internal--snackbar_direction')
142
+ : /* istanbul ignore next: TODO чтобы протестировать кейс, нужно мокать useMediaQueries(), чтобы перебивать mediaQueries.smallTabletPlus.matches */
143
+ rootRef.current.style.setProperty(
144
+ '--vkui_internal--snackbar_direction',
145
+ `${direction}`,
146
+ );
138
147
  }
139
148
  });
140
149
  },
@@ -174,7 +183,11 @@ export const Snackbar: React.FC<SnackbarProps> & { Basic: typeof Basic } = ({
174
183
  );
175
184
 
176
185
  if (shiftDataRef.current.shifted) {
177
- updateShiftAxisCSSProperties(shiftDataRef.current.x, shiftDataRef.current.y);
186
+ updateShiftAxisCSSProperties(
187
+ shiftDataRef.current.x,
188
+ shiftDataRef.current.y,
189
+ shiftDataRef.current.direction,
190
+ );
178
191
  }
179
192
  }
180
193
  };
@@ -218,7 +231,7 @@ export const Snackbar: React.FC<SnackbarProps> & { Basic: typeof Basic } = ({
218
231
  panGestureRecognizer.current = null;
219
232
 
220
233
  if (open) {
221
- updateShiftAxisCSSProperties(null, null);
234
+ updateShiftAxisCSSProperties(null, null, null);
222
235
  }
223
236
  }
224
237
  },
@@ -9,6 +9,7 @@ export type SnackbarPlacement =
9
9
  export type ShiftData = {
10
10
  x: number;
11
11
  y: number;
12
+ direction: number | null;
12
13
  width: number;
13
14
  height: number;
14
15
  shifted: boolean;
@@ -30,7 +30,8 @@ export function getInitialShiftData(
30
30
  ): ShiftData {
31
31
  return {
32
32
  shifted: false,
33
- isDesktop: mediaQueries.smallTabletPlus.matches, // eslint-disable-line no-restricted-properties
33
+ direction: null,
34
+ isDesktop: mediaQueries.smallTabletPlus.matches, // eslint-disable-line no-restricted-properties,
34
35
  x: 0,
35
36
  y: 0,
36
37
  width,
@@ -55,7 +56,11 @@ export function getMovedShiftData(
55
56
  shiftData.y = rubberbandIfOutOfBounds(nextShift.y, 0, shiftData.height);
56
57
  }
57
58
  } else if (placement.startsWith('bottom')) {
58
- shiftData.x = rubberbandIfOutOfBounds(nextShift.x, -shiftData.width, 0);
59
+ shiftData.x = nextShift.x;
60
+
61
+ const movingToLeft = nextShift.x < 0 ? -1 : null;
62
+ const movingToRight = nextShift.x > 0 ? 1 : null;
63
+ shiftData.direction = movingToLeft || movingToRight;
59
64
  }
60
65
 
61
66
  if (placement.startsWith('top')) {
@@ -100,9 +105,12 @@ export function shouldBeClosedByShiftData(
100
105
  relativeClientRect.y > 0 ? velocity.y > MINIMUM_PAN_GESTURE_FOR_TRIGGER_CLOSE : false;
101
106
  }
102
107
  } else if (placement.startsWith('bottom')) {
103
- shouldBeClosedThreshold.x = relativeClientRect.x < -relativeClientRect.width / 2;
108
+ shouldBeClosedThreshold.x =
109
+ relativeClientRect.x < -relativeClientRect.width / 2 ||
110
+ relativeClientRect.x > relativeClientRect.width / 2;
104
111
  shouldBeClosedByVelocity.x =
105
- relativeClientRect.x < 0 ? velocity.x < -MINIMUM_PAN_GESTURE_FOR_TRIGGER_CLOSE : false;
112
+ (relativeClientRect.x < 0 && velocity.x < -MINIMUM_PAN_GESTURE_FOR_TRIGGER_CLOSE) ||
113
+ (relativeClientRect.x > 0 && velocity.x > MINIMUM_PAN_GESTURE_FOR_TRIGGER_CLOSE);
106
114
  }
107
115
 
108
116
  if (placement.startsWith('top')) {
@@ -18,7 +18,6 @@ export interface TextareaProps
18
18
  extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'onResize'>,
19
19
  HasRef<HTMLTextAreaElement>,
20
20
  HasRootRef<HTMLElement>,
21
- Pick<React.CSSProperties, 'maxHeight'>,
22
21
  HasAlign,
23
22
  FormFieldProps {
24
23
  grow?: boolean;
@@ -73,11 +72,11 @@ export const Textarea = ({
73
72
  before={before}
74
73
  afterAlign={afterAlign}
75
74
  beforeAlign={beforeAlign}
75
+ maxHeight={maxHeight}
76
76
  >
77
77
  <UnstyledTextField
78
78
  {...restProps}
79
79
  as="textarea"
80
- style={{ maxHeight }}
81
80
  rows={rows}
82
81
  className={styles['Textarea__el']}
83
82
  onChange={callMultiple(onChange, resize)}
@@ -55,6 +55,10 @@ export interface TooltipProps extends AllowedFloatingComponentProps, AllowedTool
55
55
  * Отключает закрытие по клику.
56
56
  */
57
57
  disableCloseAfterClick?: boolean;
58
+ /**
59
+ * Отключает появление при фокусе.
60
+ */
61
+ disableTriggerOnFocus?: boolean;
58
62
  }
59
63
 
60
64
  /**
@@ -69,6 +73,7 @@ export const Tooltip = ({
69
73
  offsetByCrossAxis = 0,
70
74
  hideWhenReferenceHidden,
71
75
  disableFlipMiddleware = false,
76
+ disableTriggerOnFocus = false,
72
77
 
73
78
  // useFloatingWithInteractions
74
79
  defaultShown,
@@ -131,7 +136,7 @@ export const Tooltip = ({
131
136
  shown: shownProp,
132
137
  onShownChange,
133
138
  placement: strictPlacement,
134
- trigger: ['hover', 'focus'],
139
+ trigger: disableTriggerOnFocus ? 'hover' : ['hover', 'focus'],
135
140
  hoverDelay,
136
141
  closeAfterClick: !disableCloseAfterClick,
137
142
  disableInteractive: !enableInteractive,
package/src/index.ts CHANGED
@@ -124,8 +124,11 @@ export type {
124
124
  export { ActionSheetItem } from './components/ActionSheetItem/ActionSheetItem';
125
125
  export type { ActionSheetItemProps } from './components/ActionSheetItem/ActionSheetItem';
126
126
  export { ActionSheetDefaultIosCloseItem } from './components/ActionSheet/ActionSheetDefaultIosCloseItem';
127
- export { ScreenSpinner } from './components/ScreenSpinner/ScreenSpinner';
128
- export type { ScreenSpinnerProps } from './components/ScreenSpinner/ScreenSpinner';
127
+ export { ScreenSpinner, ScreenSpinnerContext } from './components/ScreenSpinner/ScreenSpinner';
128
+ export type {
129
+ ScreenSpinnerProps,
130
+ ScreenSpinnerContextProps,
131
+ } from './components/ScreenSpinner/ScreenSpinner';
129
132
  export { Snackbar } from './components/Snackbar/Snackbar';
130
133
  export type { SnackbarProps } from './components/Snackbar/Snackbar';
131
134
  export { Tooltip } from './components/Tooltip/Tooltip';
@@ -1,111 +1,95 @@
1
- import * as React from 'react';
1
+ import { useState } from 'react';
2
2
  import { noop } from '@vkontakte/vkjs';
3
+ import { usePrevious } from '../../hooks/usePrevious';
3
4
  import { useStableCallback } from '../../hooks/useStableCallback';
4
5
  import { useIsomorphicLayoutEffect } from '../useIsomorphicLayoutEffect';
5
6
 
6
7
  export type UseCSSAnimationControllerCallback = {
7
- onEnter?: () => void;
8
- onEntering?: () => void;
9
- onEntered?: () => void;
10
- onExit?: () => void;
11
- onExiting?: () => void;
12
- onExited?: () => void;
8
+ onEnter?: VoidFunction;
9
+ onEntering?: VoidFunction;
10
+ onEntered?: VoidFunction;
11
+ onExit?: VoidFunction;
12
+ onExiting?: VoidFunction;
13
+ onExited?: VoidFunction;
13
14
  };
14
15
 
15
16
  export type AnimationState = 'enter' | 'entering' | 'entered' | 'exit' | 'exiting' | 'exited';
16
17
 
17
- export type AnimationHandlers = { onAnimationStart: () => void; onAnimationEnd: () => void };
18
+ export type AnimationHandlers = { onAnimationStart: VoidFunction; onAnimationEnd: VoidFunction };
18
19
 
19
20
  export const useCSSKeyframesAnimationController = (
20
21
  stateProp: 'enter' | 'exit',
21
22
  {
22
- onEnter: onEnterProp = noop,
23
- onEntering: onEnteringProp = noop,
24
- onEntered: onEnteredProp = noop,
25
- onExit: onExitProp = noop,
26
- onExiting: onExitingProp = noop,
27
- onExited: onExitedProp = noop,
23
+ onEnter: onEnterProp,
24
+ onEntering,
25
+ onEntered,
26
+ onExit: onExitProp,
27
+ onExiting,
28
+ onExited,
28
29
  }: UseCSSAnimationControllerCallback = {},
29
30
  disableInitAnimation = false,
30
31
  ): [AnimationState, AnimationHandlers] => {
31
- const isFirstInitRef = React.useRef(disableInitAnimation);
32
- const [state, setState] = React.useState<AnimationState>(stateProp);
33
- const [willBeEnter, setWillBeEnter] = React.useState(stateProp === 'enter');
34
- const [willBeExit, setWillBeExit] = React.useState(stateProp === 'exit');
35
-
36
- const onEnter = useStableCallback(onEnterProp);
37
- const onEntering = useStableCallback(onEnteringProp);
38
- const onEntered = useStableCallback(onEnteredProp);
39
- const onExit = useStableCallback(onExitProp);
40
- const onExiting = useStableCallback(onExitingProp);
41
- const onExited = useStableCallback(onExitedProp);
42
-
43
- const entered = React.useCallback(() => {
44
- setState('entered');
45
- setWillBeEnter(false);
46
- onEntered();
47
- }, [onEntered]);
48
-
49
- const exited = React.useCallback(() => {
50
- setState('exited');
51
- setWillBeExit(false);
52
- onExited();
53
- }, [onExited]);
32
+ const [state, setState] = useState<AnimationState>(() =>
33
+ disableInitAnimation ? (stateProp === 'enter' ? 'entered' : 'exited') : stateProp,
34
+ );
35
+ const prevState = usePrevious(stateProp);
54
36
 
55
37
  const onAnimationStart = () => {
56
- if (state === 'enter' && willBeEnter) {
38
+ if (state === 'enter') {
57
39
  setState('entering');
58
- onEntering();
59
- } else if (state === 'exit' && willBeExit) {
40
+ if (onEntering) {
41
+ onEntering();
42
+ }
43
+ } else if (state === 'exit') {
60
44
  setState('exiting');
61
- onExiting();
45
+ if (onExiting) {
46
+ onExiting();
47
+ }
62
48
  }
63
49
  };
64
50
 
65
51
  const onAnimationEnd = () => {
66
- if (state === 'entering' && willBeEnter) {
67
- entered();
68
- } else if (state === 'exiting' && willBeExit) {
69
- exited();
52
+ if (state === 'entering') {
53
+ setState('entered');
54
+ if (onEntered) {
55
+ onEntered();
56
+ }
57
+ } else if (state === 'exiting') {
58
+ setState('exited');
59
+ if (onExited) {
60
+ onExited();
61
+ }
70
62
  }
71
63
  };
72
64
 
65
+ const onEnter = useStableCallback(onEnterProp || noop);
66
+ const onExit = useStableCallback(onExitProp || noop);
67
+
73
68
  useIsomorphicLayoutEffect(
74
69
  function updateState() {
70
+ if (prevState === stateProp) {
71
+ return;
72
+ }
75
73
  switch (stateProp) {
76
74
  case 'enter':
77
- if (isFirstInitRef.current && state === 'enter') {
78
- entered();
79
- break;
80
- }
81
-
82
- if (willBeEnter || state === 'entering' || state === 'entered') {
75
+ if (state === 'entering' || state === 'entered') {
83
76
  break;
84
77
  }
85
78
 
86
79
  setState('enter');
87
- setWillBeEnter(true);
88
80
  onEnter();
89
81
  break;
90
82
  case 'exit':
91
- if (isFirstInitRef.current && state === 'exit') {
92
- exited();
93
- break;
94
- }
95
-
96
- if (willBeExit || state === 'exiting' || state === 'exited') {
83
+ if (state === 'exiting' || state === 'exited') {
97
84
  break;
98
85
  }
99
86
 
100
87
  setState('exit');
101
- setWillBeExit(true);
102
88
  onExit();
103
89
  break;
104
90
  }
105
-
106
- isFirstInitRef.current = false;
107
91
  },
108
- [state, stateProp, willBeEnter, willBeExit, entered, exited, onEnter, onExit],
92
+ [state, prevState, stateProp, onEnter, onExit],
109
93
  );
110
94
 
111
95
  return [state, { onAnimationStart, onAnimationEnd }];
package/src/lib/utils.ts CHANGED
@@ -1,4 +1,6 @@
1
1
  import * as React from 'react';
2
+ import { shouldTriggerClickOnEnterOrSpace } from './accessibility';
3
+ import { isHTMLElement } from './dom';
2
4
 
3
5
  export type ImgOnlyAttributes = {
4
6
  [index in Exclude<
@@ -7,15 +9,6 @@ export type ImgOnlyAttributes = {
7
9
  >]: React.ImgHTMLAttributes<HTMLImageElement>[index];
8
10
  };
9
11
 
10
- export function debounce<A extends any[]>(fn: (...args: A) => void, delay: number) {
11
- let timeout: any;
12
-
13
- return (...args: A): void => {
14
- clearTimeout(timeout);
15
- timeout = setTimeout(() => fn(...args), delay);
16
- };
17
- }
18
-
19
12
  export function setRef<T>(element: T, ref?: React.Ref<T>): void {
20
13
  if (ref) {
21
14
  if (typeof ref === 'function') {
@@ -128,3 +121,19 @@ export function getFetchPriorityProp(value: React.ImgHTMLAttributes<HTMLElement>
128
121
  }
129
122
  return { fetchpriority: value };
130
123
  }
124
+
125
+ /*
126
+ * [a11y]
127
+ * Обрабатывает событие onkeydown
128
+ * для кастомных доступных элементов:
129
+ * - role="link" (активация по Enter)
130
+ * - role="button" (активация по Space и Enter)
131
+ */
132
+ export function clickByKeyboardHandler(event: React.KeyboardEvent<HTMLDivElement>): void {
133
+ if (!isHTMLElement(event.target) || !shouldTriggerClickOnEnterOrSpace(event)) {
134
+ return;
135
+ }
136
+
137
+ event.preventDefault();
138
+ event.target.click?.();
139
+ }
@@ -1,5 +0,0 @@
1
- import * as React from 'react';
2
- export declare function useKeyboard(): {
3
- onKeyDown: (e: React.KeyboardEvent<HTMLDivElement>) => void;
4
- };
5
- //# sourceMappingURL=useKeyboard.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useKeyboard.d.ts","sourceRoot":"","sources":["../../../../src/components/Clickable/useKeyboard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAU/B,wBAAgB,WAAW,IAAI;IAC7B,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;CAC7D,CAaA"}
@@ -1,29 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "useKeyboard", {
6
- enumerable: true,
7
- get: function() {
8
- return useKeyboard;
9
- }
10
- });
11
- const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
12
- const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
13
- const _accessibility = require("../../lib/accessibility");
14
- function useKeyboard() {
15
- function onKeyDown(e) {
16
- var // @ts-expect-error: TS2339 У элемента должен быть клик
17
- _e_target_click, _e_target;
18
- if (!(0, _accessibility.shouldTriggerClickOnEnterOrSpace)(e)) {
19
- return;
20
- }
21
- e.preventDefault();
22
- (_e_target_click = (_e_target = e.target).click) === null || _e_target_click === void 0 ? void 0 : _e_target_click.call(_e_target);
23
- }
24
- return {
25
- onKeyDown
26
- };
27
- }
28
-
29
- //# sourceMappingURL=useKeyboard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/components/Clickable/useKeyboard.tsx"],"sourcesContent":["import * as React from 'react';\nimport { shouldTriggerClickOnEnterOrSpace } from '../../lib/accessibility';\n\n/*\n * [a11y]\n * Обрабатывает событие onkeydown\n * для кастомных доступных элементов:\n * - role=\"link\" (активация по Enter)\n * - role=\"button\" (активация по Space и Enter)\n */\nexport function useKeyboard(): {\n onKeyDown: (e: React.KeyboardEvent<HTMLDivElement>) => void;\n} {\n function onKeyDown(e: React.KeyboardEvent<HTMLDivElement>) {\n if (!shouldTriggerClickOnEnterOrSpace(e)) {\n return;\n }\n\n e.preventDefault();\n\n // @ts-expect-error: TS2339 У элемента должен быть клик\n e.target.click?.();\n }\n\n return { onKeyDown };\n}\n"],"names":["useKeyboard","onKeyDown","e","shouldTriggerClickOnEnterOrSpace","preventDefault","target","click"],"mappings":";;;;+BAUgBA;;;eAAAA;;;;iEAVO;+BAC0B;AAS1C,SAASA;IAGd,SAASC,UAAUC,CAAsC;YAOvD,uDAAuD;QACvDA,iBAAAA;QAPA,IAAI,CAACC,IAAAA,+CAAgC,EAACD,IAAI;YACxC;QACF;QAEAA,EAAEE,cAAc;SAGhBF,kBAAAA,CAAAA,YAAAA,EAAEG,MAAM,EAACC,KAAK,cAAdJ,sCAAAA,qBAAAA;IACF;IAEA,OAAO;QAAED;IAAU;AACrB"}
package/dist/cjs/vkui.js DELETED
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- const _export_star = require("@swc/helpers/_/_export_star");
6
- _export_star._(require("./index"), exports);
7
-
8
- //# sourceMappingURL=vkui.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/vkui.js"],"sourcesContent":["export * from './index';\n"],"names":[],"mappings":";;;;;uBAAc"}
@@ -1,5 +0,0 @@
1
- import * as React from 'react';
2
- export declare function useKeyboard(): {
3
- onKeyDown: (e: React.KeyboardEvent<HTMLDivElement>) => void;
4
- };
5
- //# sourceMappingURL=useKeyboard.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useKeyboard.d.ts","sourceRoot":"","sources":["../../../src/components/Clickable/useKeyboard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAU/B,wBAAgB,WAAW,IAAI;IAC7B,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;CAC7D,CAaA"}
@@ -1,24 +0,0 @@
1
- import * as React from 'react';
2
- import { shouldTriggerClickOnEnterOrSpace } from '../../lib/accessibility';
3
- /*
4
- * [a11y]
5
- * Обрабатывает событие onkeydown
6
- * для кастомных доступных элементов:
7
- * - role="link" (активация по Enter)
8
- * - role="button" (активация по Space и Enter)
9
- */ export function useKeyboard() {
10
- function onKeyDown(e) {
11
- var // @ts-expect-error: TS2339 У элемента должен быть клик
12
- _e_target_click, _e_target;
13
- if (!shouldTriggerClickOnEnterOrSpace(e)) {
14
- return;
15
- }
16
- e.preventDefault();
17
- (_e_target_click = (_e_target = e.target).click) === null || _e_target_click === void 0 ? void 0 : _e_target_click.call(_e_target);
18
- }
19
- return {
20
- onKeyDown
21
- };
22
- }
23
-
24
- //# sourceMappingURL=useKeyboard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/components/Clickable/useKeyboard.tsx"],"sourcesContent":["import * as React from 'react';\nimport { shouldTriggerClickOnEnterOrSpace } from '../../lib/accessibility';\n\n/*\n * [a11y]\n * Обрабатывает событие onkeydown\n * для кастомных доступных элементов:\n * - role=\"link\" (активация по Enter)\n * - role=\"button\" (активация по Space и Enter)\n */\nexport function useKeyboard(): {\n onKeyDown: (e: React.KeyboardEvent<HTMLDivElement>) => void;\n} {\n function onKeyDown(e: React.KeyboardEvent<HTMLDivElement>) {\n if (!shouldTriggerClickOnEnterOrSpace(e)) {\n return;\n }\n\n e.preventDefault();\n\n // @ts-expect-error: TS2339 У элемента должен быть клик\n e.target.click?.();\n }\n\n return { onKeyDown };\n}\n"],"names":["React","shouldTriggerClickOnEnterOrSpace","useKeyboard","onKeyDown","e","preventDefault","target","click"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,gCAAgC,QAAQ,0BAA0B;AAE3E;;;;;;CAMC,GACD,OAAO,SAASC;IAGd,SAASC,UAAUC,CAAsC;YAOvD,uDAAuD;QACvDA,iBAAAA;QAPA,IAAI,CAACH,iCAAiCG,IAAI;YACxC;QACF;QAEAA,EAAEC,cAAc;SAGhBD,kBAAAA,CAAAA,YAAAA,EAAEE,MAAM,EAACC,KAAK,cAAdH,sCAAAA,qBAAAA;IACF;IAEA,OAAO;QAAED;IAAU;AACrB"}
@@ -1,5 +0,0 @@
1
- import * as React from 'react';
2
- export declare function useKeyboard(): {
3
- onKeyDown: (e: React.KeyboardEvent<HTMLDivElement>) => void;
4
- };
5
- //# sourceMappingURL=useKeyboard.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useKeyboard.d.ts","sourceRoot":"","sources":["../../../../src/components/Clickable/useKeyboard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAU/B,wBAAgB,WAAW,IAAI;IAC7B,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;CAC7D,CAaA"}
@@ -1,23 +0,0 @@
1
- import * as React from 'react';
2
- import { shouldTriggerClickOnEnterOrSpace } from '../../lib/accessibility';
3
- /*
4
- * [a11y]
5
- * Обрабатывает событие onkeydown
6
- * для кастомных доступных элементов:
7
- * - role="link" (активация по Enter)
8
- * - role="button" (активация по Space и Enter)
9
- */ export function useKeyboard() {
10
- function onKeyDown(e) {
11
- if (!shouldTriggerClickOnEnterOrSpace(e)) {
12
- return;
13
- }
14
- e.preventDefault();
15
- // @ts-expect-error: TS2339 У элемента должен быть клик
16
- e.target.click?.();
17
- }
18
- return {
19
- onKeyDown
20
- };
21
- }
22
-
23
- //# sourceMappingURL=useKeyboard.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/components/Clickable/useKeyboard.tsx"],"sourcesContent":["import * as React from 'react';\nimport { shouldTriggerClickOnEnterOrSpace } from '../../lib/accessibility';\n\n/*\n * [a11y]\n * Обрабатывает событие onkeydown\n * для кастомных доступных элементов:\n * - role=\"link\" (активация по Enter)\n * - role=\"button\" (активация по Space и Enter)\n */\nexport function useKeyboard(): {\n onKeyDown: (e: React.KeyboardEvent<HTMLDivElement>) => void;\n} {\n function onKeyDown(e: React.KeyboardEvent<HTMLDivElement>) {\n if (!shouldTriggerClickOnEnterOrSpace(e)) {\n return;\n }\n\n e.preventDefault();\n\n // @ts-expect-error: TS2339 У элемента должен быть клик\n e.target.click?.();\n }\n\n return { onKeyDown };\n}\n"],"names":["React","shouldTriggerClickOnEnterOrSpace","useKeyboard","onKeyDown","e","preventDefault","target","click"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,gCAAgC,QAAQ,0BAA0B;AAE3E;;;;;;CAMC,GACD,OAAO,SAASC;IAGd,SAASC,UAAUC,CAAsC;QACvD,IAAI,CAACH,iCAAiCG,IAAI;YACxC;QACF;QAEAA,EAAEC,cAAc;QAEhB,uDAAuD;QACvDD,EAAEE,MAAM,CAACC,KAAK;IAChB;IAEA,OAAO;QAAEJ;IAAU;AACrB"}
package/dist/cssm/vkui.js DELETED
@@ -1,3 +0,0 @@
1
- export * from './index';
2
-
3
- //# sourceMappingURL=vkui.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/vkui.js"],"sourcesContent":["export * from './index';\n"],"names":[],"mappings":"AAAA,cAAc,UAAU"}
package/dist/vkui.js DELETED
@@ -1,3 +0,0 @@
1
- export * from './index';
2
-
3
- //# sourceMappingURL=vkui.js.map
package/dist/vkui.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/vkui.js"],"sourcesContent":["export * from './index';\n"],"names":[],"mappings":"AAAA,cAAc,UAAU"}
@@ -1,26 +0,0 @@
1
- import * as React from 'react';
2
- import { shouldTriggerClickOnEnterOrSpace } from '../../lib/accessibility';
3
-
4
- /*
5
- * [a11y]
6
- * Обрабатывает событие onkeydown
7
- * для кастомных доступных элементов:
8
- * - role="link" (активация по Enter)
9
- * - role="button" (активация по Space и Enter)
10
- */
11
- export function useKeyboard(): {
12
- onKeyDown: (e: React.KeyboardEvent<HTMLDivElement>) => void;
13
- } {
14
- function onKeyDown(e: React.KeyboardEvent<HTMLDivElement>) {
15
- if (!shouldTriggerClickOnEnterOrSpace(e)) {
16
- return;
17
- }
18
-
19
- e.preventDefault();
20
-
21
- // @ts-expect-error: TS2339 У элемента должен быть клик
22
- e.target.click?.();
23
- }
24
-
25
- return { onKeyDown };
26
- }