@hh.ru/magritte-ui-bottom-sheet 6.0.2 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/BottomSheet.js CHANGED
@@ -18,18 +18,18 @@ import { Divider } from '@hh.ru/magritte-ui-divider';
18
18
  import { Layer } from '@hh.ru/magritte-ui-layer';
19
19
  import { isNavigationBarComponent, NavigationBarComponent } from '@hh.ru/magritte-ui-navigation-bar';
20
20
  import { isValidTreeSelectorWrapper } from '@hh.ru/magritte-ui-tree-selector';
21
- import { s as styles } from './bottom-sheet-vO1Ak6Kl.js';
21
+ import { s as styles } from './bottom-sheet-C4VJXwIv.js';
22
22
 
23
23
  const CSS_VAR_ENTER_ANIMATION_DURATION = '--enter-animation-duration';
24
24
  const CSS_VAR_EXIT_ANIMATION_DURATION = '--exit-animation-duration';
25
25
  const CSS_VAR_HEIGHT_ANIMATION_DURATION = '--height-transition-duration';
26
26
  const CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET = '--virtual-keyboard-top-offset';
27
27
  const CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET = '--virtual-keyboard-bottom-offset';
28
+ const checkSafari = () => /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
28
29
  const hasSelectedText = () => {
29
30
  const selection = document.getSelection();
30
31
  return !!selection && !selection.isCollapsed;
31
32
  };
32
- const isSafari = () => /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
33
33
  const toNumber = (value) => {
34
34
  const result = parseInt(value, 10);
35
35
  return Number.isInteger(result) ? result : 0;
@@ -56,7 +56,7 @@ const makeInitialState = () => ({
56
56
  exitHandlers: [],
57
57
  heightAnimationDiff: null,
58
58
  });
59
- const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, header, height = 'content', interceptClickHandlers = true, keyboardOverlaysContent = true, onAppear, onBeforeExit, onAfterExit, onClose, showDivider = 'with-scroll', showOverlay = true, visible = false, withContentPaddings = true, }, ref) => {
59
+ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, header, height = 'content', interceptClickHandlers = true, keyboardOverlaysFooter = true, onAppear, onBeforeExit, onAfterExit, onClose, showDivider = 'with-scroll', showOverlay = true, visible = false, withContentPaddings = true, }, ref) => {
60
60
  const DOCUMENT_HEIGHT = useRef(0);
61
61
  const SWIPE_THRESHOLD = useRef({ max: Infinity });
62
62
  const contentRef = useRef(null);
@@ -83,13 +83,25 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
83
83
  const [heightAnimationRunning, setHeightAnimationRunning] = useState(false);
84
84
  const bottomSheetContext = useMemo(() => ({ contentOverlayRef }), [contentOverlayRef]);
85
85
  const isContentSizedFullHeight = isValidTreeSelectorWrapper(children);
86
- const deviceFlagsRef = useRef({});
87
- if (typeof deviceFlagsRef.current.isSafari !== 'boolean' && typeof navigator !== 'undefined') {
88
- deviceFlagsRef.current.isSafari = isSafari();
89
- }
90
- if (typeof deviceFlagsRef.current.hasTouchSupport !== 'boolean' && typeof window !== 'undefined') {
91
- deviceFlagsRef.current.hasTouchSupport = 'ontouchstart' in window;
92
- }
86
+ const virtualKeyboardOffsetsRef = useRef({ top: 0, bottom: 0 });
87
+ const [isSafari, setIsSafari] = useState(null);
88
+ useEffect(() => setIsSafari(checkSafari()), [setIsSafari]);
89
+ const [hasTouchSupport, setHasTouchSupport] = useState(null);
90
+ const hasTouchSupportRef = useRef(null);
91
+ useEffect(() => {
92
+ if (!('matchMedia' in window)) {
93
+ return void 0;
94
+ }
95
+ const mediaQuery = window.matchMedia('(pointer:coarse)');
96
+ const handleMediaQueryChange = () => {
97
+ hasTouchSupportRef.current = mediaQuery.matches;
98
+ setHasTouchSupport(hasTouchSupportRef.current);
99
+ };
100
+ mediaQuery.addEventListener('change', handleMediaQueryChange);
101
+ hasTouchSupportRef.current = mediaQuery.matches;
102
+ setHasTouchSupport(hasTouchSupportRef.current);
103
+ return () => mediaQuery.removeEventListener('change', handleMediaQueryChange);
104
+ }, [setHasTouchSupport]);
93
105
  const bindEscapeToClose = useEscapeToClose(() => currentVisible && onClose?.());
94
106
  useEffect(() => bindEscapeToClose(document.body), [bindEscapeToClose]);
95
107
  const LayoutMetrics = useRef((() => {
@@ -150,7 +162,7 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
150
162
  get initialOffset() {
151
163
  if (!('initialOffset' in cache)) {
152
164
  if (height === 'half-screen' &&
153
- deviceFlagsRef.current.hasTouchSupport &&
165
+ hasTouchSupportRef.current &&
154
166
  visualContainerRef.current !== null &&
155
167
  visualViewport !== null) {
156
168
  const halfScreenOffset = visualContainerRef.current.clientHeight - visualViewport.height / 2;
@@ -162,6 +174,9 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
162
174
  }
163
175
  return cache.initialOffset ?? 0;
164
176
  },
177
+ get maxScrollTop() {
178
+ return LayoutMetrics.current.contentHeight - LayoutMetrics.current.visibleContentHeight;
179
+ },
165
180
  /**
166
181
  * Расстояние между верхним краем боттомшита и границей вьюпорта
167
182
  */
@@ -204,7 +219,7 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
204
219
  setAnimationTimeout({ appear: { enter, exit }, height: { enter: height, exit } });
205
220
  }, [setAnimationTimeout]);
206
221
  useEffect(() => {
207
- if (!currentVisible || deviceFlagsRef.current.isSafari) {
222
+ if (!currentVisible || isSafari) {
208
223
  return;
209
224
  }
210
225
  // используем Virtual Keyboard API через meta-тег вместо navigator.virtualKeyboard,
@@ -219,73 +234,129 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
219
234
  const attributes = (attributesStr !== null
220
235
  ? Object.fromEntries(attributesStr.split(',').map((keyValuePairStr) => keyValuePairStr.split('=')))
221
236
  : {});
222
- attributes['interactive-widget'] = keyboardOverlaysContent ? 'resizes-visual' : 'resizes-content';
237
+ attributes['interactive-widget'] = keyboardOverlaysFooter ? 'resizes-visual' : 'resizes-content';
223
238
  const attributesStrUpdated = Object.entries(attributes)
224
239
  .map((keyValuePair) => keyValuePair.join('='))
225
240
  .join(',');
226
241
  meta.setAttribute('content', attributesStrUpdated);
227
- }, [currentVisible, keyboardOverlaysContent]);
242
+ }, [currentVisible, isSafari, keyboardOverlaysFooter]);
243
+ const fixOverscroll = useCallback(() => {
244
+ if (hasTouchSupport) {
245
+ const isOverscrolled = LayoutMetrics.current.contentHeight + stateRef.current.scrollOffset <
246
+ LayoutMetrics.current.visibleContentHeight;
247
+ if (isOverscrolled) {
248
+ stateRef.current.scrollOffset =
249
+ LayoutMetrics.current.visibleContentHeight - LayoutMetrics.current.contentHeight;
250
+ if (contentRef.current !== null) {
251
+ contentRef.current.style.transform = translateY(stateRef.current.scrollOffset);
252
+ }
253
+ scrollContextProviderRef.current?.notify({
254
+ scrollTop: -stateRef.current.scrollOffset,
255
+ maxScrollTop: LayoutMetrics.current.maxScrollTop,
256
+ });
257
+ }
258
+ }
259
+ }, [hasTouchSupport]);
260
+ const resetScrollPosition = useCallback(() => {
261
+ if (hasTouchSupport) {
262
+ stateRef.current.scrollOffset = LayoutMetrics.current.initialOffset;
263
+ stateRef.current.swipeOffset = 0;
264
+ if (contentRef.current !== null) {
265
+ contentRef.current.style.transform = translateY(0);
266
+ }
267
+ if (swipeContainerRef.current !== null) {
268
+ swipeContainerRef.current.style.transform = translateY(LayoutMetrics.current.initialOffset);
269
+ }
270
+ }
271
+ else {
272
+ scrollContainerRef.current?.scrollTo({ top: 0 });
273
+ }
274
+ }, [hasTouchSupport]);
275
+ const recalcScrollFlags = useCallback(() => {
276
+ const scrollOffset = hasTouchSupport
277
+ ? stateRef.current.scrollOffset
278
+ : -(scrollContainerRef.current?.scrollTop ?? 0);
279
+ if (dividerRef.current !== null) {
280
+ const prevDividerVisible = stateRef.current.dividerVisible;
281
+ const isNotScrolledToEnd = LayoutMetrics.current.contentHeight + scrollOffset > LayoutMetrics.current.visibleContentHeight;
282
+ stateRef.current.dividerVisible =
283
+ showDivider === 'always' || (showDivider === 'with-scroll' && isNotScrolledToEnd);
284
+ if (stateRef.current.dividerVisible !== prevDividerVisible) {
285
+ dividerRef.current.classList.toggle(styles.dividerVisible, stateRef.current.dividerVisible);
286
+ }
287
+ }
288
+ if (grabberRef.current !== null) {
289
+ const prevGrabberUnsafe = stateRef.current.grabberUnsafe;
290
+ stateRef.current.grabberUnsafe =
291
+ Math.round(Math.max(scrollOffset, 0) + stateRef.current.swipeOffset) ===
292
+ LayoutMetrics.current.remainingAvailableHeight;
293
+ if (stateRef.current.grabberUnsafe !== prevGrabberUnsafe) {
294
+ grabberRef.current.classList.toggle(styles.grabberEnsureSafe, stateRef.current.grabberUnsafe);
295
+ }
296
+ }
297
+ }, [hasTouchSupport, showDivider]);
298
+ // терминология: https://developer.chrome.com/blog/viewport-resize-behavior/
299
+ //
300
+ // при открытии виртуальной клавиатуры браузеры двигают Visual Viewport и Layout Viewport
301
+ // с помощью двух отступов делаем так, чтобы overlay боттомшита совпадал с видимой частью экрана
228
302
  const recalcKeyboardOffsets = useCallback(() => {
229
- if (!overlayRef.current || !visualViewport) {
303
+ if (!hasTouchSupport || !contentRef.current || !overlayRef.current || !visualViewport) {
230
304
  return;
231
305
  }
306
+ LayoutMetrics.current.invalidateCache();
232
307
  if (stateRef.current.hasFocus && focusedElementRef.current !== null) {
233
- // терминология: https://developer.chrome.com/blog/viewport-resize-behavior/
234
- //
235
- // делим браузеры на три группы в зависимости от поведения при открытии виртуальной клавиатуры:
236
- // 1. Safari — ресайзит Visual Viewport, не меняет Layout Viewport.
237
- // В нем не нужно ничего корректировать при keyboardOverlaysContent=true,
238
- // а при keyboardOverlaysContent=false нужно сдвинуть НИЖНИЙ край контейнера ВВЕРХ,
239
- // чтобы он совпал с границей Visual Viewport
240
- // 2. Chrome < 108 & Chromium-based — ресайзит и Visual Viewport, и Layout Viewport.
241
- // В нем не нужно ничего корректировать при keyboardOverlaysContent=false,
242
- // а при keyboardOverlaysContent=true нужно сдвинуть НИЖНИЙ край контейнера ВНИЗ,
243
- // чтобы футер уехал под клавиатуру
244
- // 3. Chrome >= 108 — поддерживает Virtual Keyboard API и meta-тег interactive-widget.
245
- // Используем поведение `resizes-visual` (как в Safari) в случае keyboardOverlaysContent=true
246
- // и `resizes-content` (как в Chrome < 108 & Chromium-based) в случае keyboardOverlaysContent=false
247
- // Таким образом в нем ничего не нужно корректировать
248
308
  const overlayDOMRect = overlayRef.current.getBoundingClientRect();
249
309
  // любой браузер может сдвинуть Visual Viewport вверх, если фокусируемый инпут находится близко к нижней границе
250
310
  // из-за этого может возникнуть проблема, что ВЕРХНИЙ край контента уехал за границу Visual Viewport
251
311
  // сдвигаем ВЕРХНИЙ край контейнера ВНИЗ, чтобы он совпал с границей Visual Viewport
252
- const visualViewportShift = Math.round(-overlayDOMRect.top);
253
- // keyboardOverlaysContent=true, клавиатура ПОВЕРХ контента
254
- // этот кейс нужно корректировать только в Chrome < 108 & Chromium-based
255
- if (keyboardOverlaysContent) {
256
- // браузеры из этой группы меняют Layout Viewport
257
- const layoutViewportDiff = Math.round(DOCUMENT_HEIGHT.current - document.documentElement.clientHeight);
258
- setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET, `${visualViewportShift}px`);
259
- if (layoutViewportDiff > 0) {
260
- setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET, `${visualViewportShift}px`);
261
- // сдвигаем НИЖНИЙ край контейнера ВНИЗ, чтобы футер уехал под клавиатуру
262
- setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET, `${-layoutViewportDiff}px`);
263
- // при этом может возникнуть проблема, что клавиатура перекрыла инпут
264
- // проверяем это и компенсируем величину перекрытия при необходимости
265
- const focusedElementOutOfViewportHeight = Math.round(focusedElementRef.current.getBoundingClientRect().bottom +
266
- layoutViewportDiff -
267
- DOCUMENT_HEIGHT.current);
268
- if (focusedElementOutOfViewportHeight > 0) {
269
- setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET, `${focusedElementOutOfViewportHeight - layoutViewportDiff}px`);
270
- }
271
- }
272
- }
273
- // keyboardOverlaysContent=false, клавиатура ПОД контентом
274
- // этот кейс нужно корректировать только в Safari
275
- if (!keyboardOverlaysContent && deviceFlagsRef.current.isSafari) {
312
+ const topOffset = Math.round(-overlayDOMRect.top);
313
+ let bottomOffset = 0;
314
+ if (isSafari) {
276
315
  const visualViewportDiff = Math.round(overlayDOMRect.bottom - visualViewport.height);
277
- setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET, `${visualViewportShift}px`);
278
316
  if (visualViewportDiff > 0) {
279
317
  // сдвигаем НИЖНИЙ край контейнера ВВЕРХ, чтобы он совпал с границей Visual Viewport
280
- setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET, `${visualViewportDiff}px`);
318
+ bottomOffset = visualViewportDiff;
281
319
  }
282
320
  }
321
+ if (keyboardOverlaysFooter && footerRef.current !== null) {
322
+ bottomOffset -= footerRef.current.clientHeight;
323
+ }
324
+ if (topOffset !== virtualKeyboardOffsetsRef.current.top ||
325
+ bottomOffset !== virtualKeyboardOffsetsRef.current.bottom) {
326
+ setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET, `${topOffset}px`);
327
+ setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET, `${bottomOffset}px`);
328
+ }
329
+ LayoutMetrics.current.invalidateCache();
330
+ // если фокусируемый элемент лежит внутри скроллящегося контейнера и не виден, скроллим к нему
331
+ if (contentRef.current.contains(focusedElementRef.current)) {
332
+ let focusedElementOffset = 0;
333
+ for (let offsetElement = focusedElementRef.current.closest('[data-interactive]') ?? focusedElementRef.current; offsetElement !== contentRef.current && offsetElement !== null; offsetElement = offsetElement.offsetParent) {
334
+ focusedElementOffset += offsetElement.offsetTop;
335
+ }
336
+ const newScrollOffset = -Math.min(Math.max(focusedElementOffset - 10, 0), LayoutMetrics.current.maxScrollTop);
337
+ if (stateRef.current.scrollOffset !== newScrollOffset) {
338
+ stateRef.current.scrollOffset = newScrollOffset;
339
+ contentRef.current.style.transform = translateY(stateRef.current.scrollOffset);
340
+ scrollContextProviderRef.current?.notify({
341
+ scrollTop: -stateRef.current.scrollOffset,
342
+ maxScrollTop: LayoutMetrics.current.maxScrollTop,
343
+ });
344
+ }
345
+ }
346
+ recalcScrollFlags();
347
+ virtualKeyboardOffsetsRef.current.top = topOffset;
348
+ virtualKeyboardOffsetsRef.current.bottom = bottomOffset;
283
349
  }
284
350
  else {
285
351
  setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET, `0px`);
286
352
  setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET, `0px`);
353
+ LayoutMetrics.current.invalidateCache();
354
+ fixOverscroll();
355
+ recalcScrollFlags();
356
+ virtualKeyboardOffsetsRef.current.top = 0;
357
+ virtualKeyboardOffsetsRef.current.bottom = 0;
287
358
  }
288
- }, [keyboardOverlaysContent]);
359
+ }, [fixOverscroll, hasTouchSupport, isSafari, keyboardOverlaysFooter, recalcScrollFlags]);
289
360
  const handleFocus = useCallback((event) => {
290
361
  const focusedElement = event.target;
291
362
  const initialViewportHeight = visualViewport?.height;
@@ -301,6 +372,7 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
301
372
  recalcKeyboardOffsets();
302
373
  if (!stateRef.current.hasFocus) {
303
374
  visualViewport?.removeEventListener('resize', handleResize);
375
+ visualViewport?.removeEventListener('scroll', handleResize);
304
376
  }
305
377
  };
306
378
  // если спамить фокус/блюр инпута, ивент visualViewport.resize может не долететь
@@ -308,6 +380,7 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
308
380
  const waitForResize = () => {
309
381
  if (performance.now() - resizeRAFStart > 1000 || visualViewport?.height !== initialViewportHeight) {
310
382
  visualViewport?.removeEventListener('resize', handleResize);
383
+ visualViewport?.removeEventListener('scroll', handleResize);
311
384
  stateRef.current.resizeRAFHandle = null;
312
385
  recalcKeyboardOffsets();
313
386
  }
@@ -316,10 +389,6 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
316
389
  }
317
390
  };
318
391
  const handleBlur = () => {
319
- if (deviceFlagsRef.current.isSafari) {
320
- setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET, `0px`);
321
- setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET, `0px`);
322
- }
323
392
  stateRef.current.hasFocus = false;
324
393
  if (stateRef.current.resizeRAFHandle !== null) {
325
394
  cancelAnimationFrame(stateRef.current.resizeRAFHandle);
@@ -327,13 +396,22 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
327
396
  }
328
397
  focusedElement.removeEventListener('blur', handleBlur);
329
398
  focusedElementRef.current = null;
399
+ if (isSafari) {
400
+ recalcKeyboardOffsets();
401
+ }
330
402
  };
331
403
  stateRef.current.hasFocus = true;
332
404
  stateRef.current.resizeRAFHandle = requestAnimationFrame(waitForResize);
333
405
  visualViewport?.addEventListener('resize', handleResize);
406
+ // событие scroll может прилететь, только если браузер сдвинул вьюпорт из-за появления виртуальной клавиатуры
407
+ // пользовательский скролл не вызывает событие scroll, т.к. нативный скролл отключен
408
+ // в Safari событие resize может прилететь до того как браузер сдвинул вьюпорт, поэтому слушаем scroll
409
+ if (isSafari) {
410
+ visualViewport?.addEventListener('scroll', handleResize);
411
+ }
334
412
  focusedElement.addEventListener('blur', handleBlur);
335
413
  focusedElementRef.current = focusedElement;
336
- }, [recalcKeyboardOffsets]);
414
+ }, [isSafari, recalcKeyboardOffsets]);
337
415
  // contentOverlay совпадает по границам с контентом боттомшита, но лежит вне боттомшита,
338
416
  // чтобы чайлды contentOverlay не обрезались границами боттомшита
339
417
  // например, снекбар, лежащий внутри contentOverlay, при смахивании может оказаться в любом месте экрана
@@ -346,29 +424,6 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
346
424
  contentOverlayRef.current.style.height = `${LayoutMetrics.current.visibleContentHeight}px`;
347
425
  }
348
426
  }, []);
349
- const recalcScrollFlags = useCallback(() => {
350
- const scrollOffset = deviceFlagsRef.current.hasTouchSupport
351
- ? stateRef.current.scrollOffset
352
- : -(scrollContainerRef.current?.scrollTop ?? 0);
353
- if (dividerRef.current !== null) {
354
- const prevDividerVisible = stateRef.current.dividerVisible;
355
- const isNotScrolledToEnd = LayoutMetrics.current.contentHeight + scrollOffset > LayoutMetrics.current.visibleContentHeight;
356
- stateRef.current.dividerVisible =
357
- showDivider === 'always' || (showDivider === 'with-scroll' && isNotScrolledToEnd);
358
- if (stateRef.current.dividerVisible !== prevDividerVisible) {
359
- dividerRef.current.classList.toggle(styles.dividerVisible, stateRef.current.dividerVisible);
360
- }
361
- }
362
- if (grabberRef.current !== null) {
363
- const prevGrabberUnsafe = stateRef.current.grabberUnsafe;
364
- stateRef.current.grabberUnsafe =
365
- Math.round(Math.max(scrollOffset, 0) + stateRef.current.swipeOffset) ===
366
- LayoutMetrics.current.remainingAvailableHeight;
367
- if (stateRef.current.grabberUnsafe !== prevGrabberUnsafe) {
368
- grabberRef.current.classList.toggle(styles.grabberEnsureSafe, stateRef.current.grabberUnsafe);
369
- }
370
- }
371
- }, [showDivider]);
372
427
  // помещает боттомшит в позицию вне экрана снизу, которая может быть начальной либо конечной точкой анимации
373
428
  const setTransformToInvisible = useCallback(() => {
374
429
  LayoutMetrics.current.invalidateCache();
@@ -410,21 +465,6 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
410
465
  stateRef.current.exitHandlers = [];
411
466
  onAfterExit?.();
412
467
  }, [onAfterExit]);
413
- const resetScrollPosition = useCallback(() => {
414
- if (deviceFlagsRef.current.hasTouchSupport) {
415
- stateRef.current.scrollOffset = LayoutMetrics.current.initialOffset;
416
- stateRef.current.swipeOffset = 0;
417
- if (contentRef.current !== null) {
418
- contentRef.current.style.transform = translateY(0);
419
- }
420
- if (swipeContainerRef.current !== null) {
421
- swipeContainerRef.current.style.transform = translateY(LayoutMetrics.current.initialOffset);
422
- }
423
- }
424
- else {
425
- scrollContainerRef.current?.scrollTo({ top: 0 });
426
- }
427
- }, []);
428
468
  const handleHeightAnimationStart = useCallback(() => {
429
469
  LayoutMetrics.current.invalidateCache();
430
470
  if (stateRef.current.heightAnimationDiff !== null && visualContainerRef.current !== null) {
@@ -444,7 +484,7 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
444
484
  requestAnimationFrame(recalcScrollFlags);
445
485
  scrollContextProviderRef.current?.notify({
446
486
  scrollTop: 0,
447
- maxScrollTop: LayoutMetrics.current.contentHeight - LayoutMetrics.current.visibleContentHeight,
487
+ maxScrollTop: LayoutMetrics.current.maxScrollTop,
448
488
  });
449
489
  }, [setHeightAnimationRunning, recalcContentOverlayPosition, recalcScrollFlags]);
450
490
  const handleSwipeMove = useCallback((event) => {
@@ -555,7 +595,7 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
555
595
  recalcScrollFlags();
556
596
  scrollContextProviderRef.current?.notify({
557
597
  scrollTop: Math.max(-stateRef.current.scrollOffset, 0),
558
- maxScrollTop: LayoutMetrics.current.contentHeight - LayoutMetrics.current.visibleContentHeight,
598
+ maxScrollTop: LayoutMetrics.current.maxScrollTop,
559
599
  });
560
600
  }
561
601
  }
@@ -565,7 +605,9 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
565
605
  if ((!allowScrollWhileFocused && stateRef.current.hasFocus) ||
566
606
  (stateRef.current.touchAction !== null && stateRef.current.touchAction !== 'scroll') ||
567
607
  hasSelectedText() ||
568
- (focusedElementRef.current !== null && focusedElementTouchY !== null)) {
608
+ (focusedElementRef.current !== null &&
609
+ focusedElementTouchY !== null &&
610
+ focusedElementRef.current.clientHeight !== focusedElementRef.current.scrollHeight)) {
569
611
  return;
570
612
  }
571
613
  handleScroll(event.delta);
@@ -589,6 +631,7 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
589
631
  focusedElementTouchY = null;
590
632
  swipeHandlers.onTouchStart(event);
591
633
  }
634
+ visualContainer.classList.add(styles.noCaret);
592
635
  };
593
636
  const handleTouchMove = (event) => {
594
637
  event.preventDefault();
@@ -601,6 +644,14 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
601
644
  swipeHandlers.onTouchMove(event);
602
645
  }
603
646
  };
647
+ const handleTouchEnd = (event) => {
648
+ swipeHandlers.onTouchEnd(event);
649
+ visualContainer.classList.remove(styles.noCaret);
650
+ };
651
+ const handleTouchCancel = (event) => {
652
+ swipeHandlers.onTouchCancel(event);
653
+ visualContainer.classList.remove(styles.noCaret);
654
+ };
604
655
  const removeScrollHandlers = initScrollHandlers({
605
656
  axis: 'vertical',
606
657
  wrapperRef: visualContainerRef,
@@ -609,14 +660,14 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
609
660
  });
610
661
  visualContainer.addEventListener('touchstart', handleTouchStart);
611
662
  visualContainer.addEventListener('touchmove', handleTouchMove);
612
- visualContainer.addEventListener('touchend', swipeHandlers.onTouchEnd);
613
- visualContainer.addEventListener('touchcancel', swipeHandlers.onTouchCancel);
663
+ visualContainer.addEventListener('touchend', handleTouchEnd);
664
+ visualContainer.addEventListener('touchcancel', handleTouchCancel);
614
665
  return () => {
615
666
  removeScrollHandlers();
616
667
  visualContainer.removeEventListener('touchstart', handleTouchStart);
617
668
  visualContainer.removeEventListener('touchmove', handleTouchMove);
618
- visualContainer.removeEventListener('touchend', swipeHandlers.onTouchEnd);
619
- visualContainer.removeEventListener('touchcancel', swipeHandlers.onTouchCancel);
669
+ visualContainer.removeEventListener('touchend', handleTouchEnd);
670
+ visualContainer.removeEventListener('touchcancel', handleTouchCancel);
620
671
  };
621
672
  }, [allowScrollWhileFocused, recalcScrollFlags, swipeHandlers]);
622
673
  // при изменении высоты контента анимируем ее
@@ -668,20 +719,11 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
668
719
  if (visibleContentHeightDiff !== 0) {
669
720
  resetScrollPosition();
670
721
  }
671
- else if (deviceFlagsRef.current.hasTouchSupport) {
722
+ else {
672
723
  // если высота видимой части контента не изменилась,
673
724
  // но позиция скролла превысила максимально допустимую из-за уменьшения высоты контента,
674
725
  // сбрасываем позицию скролла на максимально допустимую
675
- const isOverscrolled = LayoutMetrics.current.contentHeight + stateRef.current.scrollOffset <
676
- LayoutMetrics.current.visibleContentHeight;
677
- if (isOverscrolled) {
678
- stateRef.current.scrollOffset =
679
- LayoutMetrics.current.visibleContentHeight - LayoutMetrics.current.contentHeight;
680
- if (contentRef.current !== null) {
681
- contentRef.current.style.transform = translateY(stateRef.current.scrollOffset);
682
- }
683
- scrollContextProviderRef.current?.notify({ scrollTop: -stateRef.current.scrollOffset });
684
- }
726
+ fixOverscroll();
685
727
  }
686
728
  const heightAnimationDiff = visibleContentHeightDiff + containersHeightDiff;
687
729
  if (heightAnimationDiff !== 0) {
@@ -718,14 +760,20 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
718
760
  resizeObserver.disconnect();
719
761
  header !== null && header.removeHeightObserver(handleHeightChange);
720
762
  };
721
- }, [setHeightAnimationRunning, recalcScrollFlags, recalcContentOverlayPosition, resetScrollPosition]);
763
+ }, [
764
+ fixOverscroll,
765
+ recalcContentOverlayPosition,
766
+ recalcScrollFlags,
767
+ resetScrollPosition,
768
+ setHeightAnimationRunning,
769
+ ]);
722
770
  const handleAppearAnimationEnd = useCallback(() => {
723
771
  const removeHeightObserver = initHeightObserver();
724
772
  removeHeightObserver && stateRef.current.exitHandlers.push(removeHeightObserver);
725
- const removeTransformHandlers = deviceFlagsRef.current.hasTouchSupport && initTransformHandlers();
773
+ const removeTransformHandlers = hasTouchSupport && initTransformHandlers();
726
774
  removeTransformHandlers && stateRef.current.exitHandlers.push(removeTransformHandlers);
727
775
  onAppearRef.current?.();
728
- }, [initHeightObserver, initTransformHandlers]);
776
+ }, [hasTouchSupport, initHeightObserver, initTransformHandlers]);
729
777
  const { onTouchEnd, ...eventHandlers } = useNoBubbling();
730
778
  if (!animationTimeout) {
731
779
  return null;
@@ -738,7 +786,7 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
738
786
  [styles.contentWithoutHeader]: !header,
739
787
  [styles.contentSizedFullScreen]: isContentSizedFullHeight,
740
788
  }), ref: contentRef, children: jsx(BottomSheetContext.Provider, { value: bottomSheetContext, children: children }) }));
741
- const scrollContainer = deviceFlagsRef.current.hasTouchSupport ? (jsx(CustomScrollContextProvider, { ref: scrollContextProviderRef, children: jsxs("div", { className: styles.scrollContainer, onFocus: handleFocus, ref: scrollContainerRef, children: [navigationBar, content] }) })) : (jsxs("div", { className: classnames(styles.scrollContainer, styles.nativeScrollContainer), onFocus: handleFocus, onScroll: recalcScrollFlags, ref: scrollContainerRef, children: [navigationBar, content] }));
789
+ const scrollContainer = hasTouchSupport ? (jsx(CustomScrollContextProvider, { ref: scrollContextProviderRef, children: jsxs("div", { className: styles.scrollContainer, onFocus: handleFocus, ref: scrollContainerRef, children: [navigationBar, content] }) })) : (jsxs("div", { className: classnames(styles.scrollContainer, styles.nativeScrollContainer), onFocus: handleFocus, onScroll: recalcScrollFlags, ref: scrollContainerRef, children: [navigationBar, content] }));
742
790
  const clonedFooter = footer && isActionBarComponent(footer)
743
791
  ? cloneElement(footer, { type: footer.props.type || 'mobile', showDivider: false })
744
792
  : footer;
@@ -759,9 +807,9 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
759
807
  [styles.heightTransitionAnimation]: heightTransition === 'entering',
760
808
  }), "data-qa": appearTransition === 'entered' ? 'bottom-sheet-content' : undefined, ref: bottomSheetRef, children: [scrollContainer, jsxs("div", { className: styles.footer, ref: footerRef, children: [footer && (jsx("div", { className: classnames(styles.divider, {
761
809
  [styles.dividerVisible]: stateRef.current.dividerVisible,
762
- }), ref: dividerRef, children: jsx(Divider, {}) })), interceptClickHandlers && deviceFlagsRef.current.hasTouchSupport ? (jsx(ClickInterceptor, { children: clonedFooter })) : (clonedFooter)] })] }), jsx("div", { className: styles.contentOverlay, ref: contentOverlayRef })] })] }) }));
810
+ }), ref: dividerRef, children: jsx(Divider, {}) })), interceptClickHandlers && hasTouchSupport ? (jsx(ClickInterceptor, { children: clonedFooter })) : (clonedFooter)] })] }), jsx("div", { className: styles.contentOverlay, ref: contentOverlayRef })] })] }) }));
763
811
  };
764
- return createPortal(jsx("div", { className: styles.cssVariablesContainer, "data-qa": "bottom-sheet-css-variables", ref: cssVariablesContainerRef, children: jsx(Transition, { appear: true, in: currentVisible, mountOnEnter: true, onEnter: setTransformToInvisible, onEntering: setTransformToVisible, onEntered: handleAppearAnimationEnd, onExit: handleExitAnimationStart, onExiting: setTransformToInvisible, onExited: handleExitAnimationEnd, timeout: animationTimeout.appear, unmountOnExit: true, nodeRef: contentRef, children: (appearTransition) => (jsx(Transition, { in: heightAnimationRunning, onEnter: handleHeightAnimationStart, onEntered: handleHeightAnimationEnd, timeout: animationTimeout.height, nodeRef: contentRef, children: (heightTransition) => renderFunc(appearTransition, heightTransition) })) }) }), document.body);
812
+ return createPortal(jsx("div", { className: styles.cssVariablesContainer, "data-qa": "bottom-sheet-css-variables", ref: cssVariablesContainerRef, children: jsx(Transition, { appear: true, in: currentVisible, mountOnEnter: true, onEnter: setTransformToInvisible, onEntering: setTransformToVisible, onEntered: handleAppearAnimationEnd, onExit: handleExitAnimationStart, onExiting: setTransformToInvisible, onExited: handleExitAnimationEnd, timeout: animationTimeout.appear, unmountOnExit: true, nodeRef: contentRef, children: (appearTransition) => (jsx(Transition, { in: heightAnimationRunning, onEnter: handleHeightAnimationStart, onEntered: handleHeightAnimationEnd, timeout: animationTimeout.height, nodeRef: contentRef, children: (heightTransition) => renderFunc(appearTransition, heightTransition) })) }, `hasTouchSupport:${hasTouchSupport}`) }), document.body);
765
813
  };
766
814
  const BottomSheet = forwardRef(BottomSheetRenderFunc);
767
815
 
@@ -1 +1 @@
1
- {"version":3,"file":"BottomSheet.js","sources":["../src/BottomSheet.tsx"],"sourcesContent":["import {\n FocusEventHandler,\n ForwardRefRenderFunction,\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n cloneElement,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { Transition, TransitionStatus } from 'react-transition-group';\nimport classnames from 'classnames';\n\nimport { useEscapeToClose } from '@hh.ru/magritte-common-keyboard';\nimport { disableOverscroll, disableScroll } from '@hh.ru/magritte-common-modal-helper';\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { useNoBubbling } from '@hh.ru/magritte-common-use-no-bubbling';\nimport { useSwipeHandlers, SwipeEventHandler } from '@hh.ru/magritte-common-use-swipe';\nimport {\n ScrollGestureEvent,\n CustomScrollContextNotifier,\n CustomScrollContextProvider,\n initScrollHandlers,\n} from '@hh.ru/magritte-internal-custom-scroll';\nimport { isActionBarComponent } from '@hh.ru/magritte-ui-action-bar';\nimport { BottomSheetContext } from '@hh.ru/magritte-ui-bottom-sheet/BottomSheetContext';\nimport { ClickInterceptor } from '@hh.ru/magritte-ui-bottom-sheet/ClickInterceptor';\nimport { BottomSheetProps } from '@hh.ru/magritte-ui-bottom-sheet/types';\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { Divider } from '@hh.ru/magritte-ui-divider';\nimport { Layer } from '@hh.ru/magritte-ui-layer';\nimport {\n NavigationBarComponent,\n NavigationBarComponentRef,\n isNavigationBarComponent,\n} from '@hh.ru/magritte-ui-navigation-bar';\nimport { isValidTreeSelectorWrapper } from '@hh.ru/magritte-ui-tree-selector';\n\nimport styles from './bottom-sheet.less';\n\nconst CSS_VAR_ENTER_ANIMATION_DURATION = '--enter-animation-duration';\nconst CSS_VAR_EXIT_ANIMATION_DURATION = '--exit-animation-duration';\nconst CSS_VAR_HEIGHT_ANIMATION_DURATION = '--height-transition-duration';\nconst CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET = '--virtual-keyboard-top-offset';\nconst CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET = '--virtual-keyboard-bottom-offset';\n\nconst hasSelectedText = () => {\n const selection = document.getSelection();\n return !!selection && !selection.isCollapsed;\n};\n\nconst isSafari = () => /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\nconst toNumber = (value: string) => {\n const result = parseInt(value, 10);\n return Number.isInteger(result) ? result : 0;\n};\n\nconst textInputTypes = ['text', 'password', 'email', 'search', 'tel', 'url', 'number'];\nconst isTextInputElement = (element: Element): element is HTMLInputElement => {\n if (element instanceof HTMLInputElement) {\n return textInputTypes.includes(element.type);\n } else if (element instanceof HTMLTextAreaElement) {\n return true;\n }\n\n return false;\n};\n\nconst translateY = (value: number) => `translate3d(0, ${value}px, 0)`;\n\ntype AnimationTimeout = { [AnimationType in 'appear' | 'height']: { [AnimationStage in 'enter' | 'exit']: number } };\n\ntype State = {\n dividerVisible: boolean;\n // если боттомшит упирается в верхний край экрана, челка может перекрыть граббер и его нужно переместить в safe area\n grabberUnsafe: boolean;\n hasFocus: boolean;\n resizeRAFHandle: ReturnType<typeof requestAnimationFrame> | null;\n // translateY для эмуляции скролла, отрицательный либо меньше LayoutMetrics.current.initialOffset\n scrollOffset: number;\n // translateY для эмуляции свайпа, всегда положительный либо 0\n swipeOffset: number;\n // текущее действие, инициированное пользователем\n touchAction:\n | null // может быть начато любое действие\n | 'complete' // палец приложен, но действие завершено — не реагируем на тач, пока пользователь не отпустит палец\n | 'scroll' // палец приложен, скроллим контент внутри боттомшита\n | 'swipe'; // палец приложен, свайпаем весь боттомшит вниз, чтобы закрыть его, или вверх, чтобы отменить свайп\n exitHandlers: Array<VoidFunction>;\n // число, на которое нужно анимировать изменение высоты контента боттомшита\n heightAnimationDiff: number | null;\n heightAnimationCallback?: VoidFunction | null;\n};\n\nconst makeInitialState = (): State => ({\n dividerVisible: false,\n grabberUnsafe: false,\n hasFocus: false,\n resizeRAFHandle: null,\n scrollOffset: 0,\n swipeOffset: 0,\n touchAction: null,\n exitHandlers: [],\n heightAnimationDiff: null,\n});\n\ntype DeviceFlags = {\n isSafari?: boolean;\n hasTouchSupport?: boolean;\n};\n\nconst BottomSheetRenderFunc: ForwardRefRenderFunction<HTMLElement, BottomSheetProps> = (\n {\n allowScrollWhileFocused,\n children,\n footer,\n header,\n height = 'content',\n interceptClickHandlers = true,\n keyboardOverlaysContent = true,\n onAppear,\n onBeforeExit,\n onAfterExit,\n onClose,\n showDivider = 'with-scroll',\n showOverlay = true,\n visible = false,\n withContentPaddings = true,\n },\n ref\n) => {\n const DOCUMENT_HEIGHT = useRef(0);\n const SWIPE_THRESHOLD = useRef({ max: Infinity });\n\n const contentRef = useRef<HTMLDivElement>(null);\n const contentOverlayRef = useRef<HTMLDivElement>(null);\n const cssVariablesContainerRef = useRef<HTMLDivElement>(null);\n const dividerRef = useRef<HTMLDivElement>(null);\n const focusedElementRef = useRef<HTMLInputElement | HTMLTextAreaElement | null>(null);\n const footerRef = useRef<HTMLDivElement>(null);\n const grabberRef = useRef<HTMLDivElement>(null);\n const headerRef = useRef<NavigationBarComponentRef>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const swipeContainerRef = useRef<HTMLDivElement>(null);\n const visualContainerRef = useRef<HTMLDivElement>(null);\n const bottomSheetRef = useMultipleRefs(ref, visualContainerRef);\n const scrollContextProviderRef = useRef<CustomScrollContextNotifier>(null);\n\n const currentVisible = useBreakpoint().isMobile && visible;\n const onAppearRef = useRef(onAppear);\n onAppearRef.current = onAppear;\n const onCloseRef = useRef(onClose);\n onCloseRef.current = onClose;\n const stateRef = useRef<State>(makeInitialState());\n const [animationTimeout, setAnimationTimeout] = useState<AnimationTimeout | null>(null);\n const [heightAnimationRunning, setHeightAnimationRunning] = useState(false);\n const bottomSheetContext = useMemo(() => ({ contentOverlayRef }), [contentOverlayRef]);\n const isContentSizedFullHeight = isValidTreeSelectorWrapper(children);\n const deviceFlagsRef = useRef<DeviceFlags>({});\n if (typeof deviceFlagsRef.current.isSafari !== 'boolean' && typeof navigator !== 'undefined') {\n deviceFlagsRef.current.isSafari = isSafari();\n }\n if (typeof deviceFlagsRef.current.hasTouchSupport !== 'boolean' && typeof window !== 'undefined') {\n deviceFlagsRef.current.hasTouchSupport = 'ontouchstart' in window;\n }\n\n const bindEscapeToClose = useEscapeToClose(() => currentVisible && onClose?.());\n useEffect(() => bindEscapeToClose(document.body), [bindEscapeToClose]);\n\n const LayoutMetrics = useRef(\n (() => {\n let cache: Record<string, number> = {};\n return {\n get bottomSheetHeight() {\n if (!('bottomSheetHeight' in cache) && visualContainerRef.current !== null) {\n cache.bottomSheetHeight = visualContainerRef.current.clientHeight;\n }\n return cache.bottomSheetHeight ?? 0;\n },\n /**\n * Высота контента\n * Может превышать высоту контейнера из-за скролла\n */\n get contentHeight() {\n if (!('contentHeight' in cache) && contentRef.current !== null) {\n cache.contentHeight = contentRef.current.clientHeight;\n }\n return cache.contentHeight ?? 0;\n },\n /**\n * Высота видимой части контента\n */\n get visibleContentHeight() {\n if (!('visibleContentHeight' in cache) && scrollContainerRef.current !== null) {\n const layoutHeaderHeight = headerRef.current?.layoutHeight ?? 0;\n cache.visibleContentHeight = scrollContainerRef.current.clientHeight - layoutHeaderHeight;\n }\n return cache.visibleContentHeight ?? 0;\n },\n /**\n * Положение верхнего края видимой части контента относительно вьюпорта\n */\n get contentTop() {\n if (!('contentTop' in cache) && visualContainerRef.current !== null) {\n const visibleHeaderHeight = headerRef.current?.visibleHeight ?? 0;\n cache.contentTop = visualContainerRef.current.offsetTop + visibleHeaderHeight;\n }\n return cache.contentTop ?? 0;\n },\n get footerHeight() {\n if (!('footerHeight' in cache) && footerRef.current !== null) {\n cache.footerHeight = footerRef.current.clientHeight;\n }\n return cache.footerHeight ?? 0;\n },\n /**\n * Фактическая высота, которую NavigationBar занимает в боттомшите\n * Может отличаться от видимой высоты NavigationBar\n */\n get headerHeight() {\n if (!('headerHeight' in cache) && headerRef.current !== null) {\n cache.headerHeight = headerRef.current.layoutHeight;\n }\n return cache.headerHeight ?? 0;\n },\n get initialOffset() {\n if (!('initialOffset' in cache)) {\n if (\n height === 'half-screen' &&\n deviceFlagsRef.current.hasTouchSupport &&\n visualContainerRef.current !== null &&\n visualViewport !== null\n ) {\n const halfScreenOffset =\n visualContainerRef.current.clientHeight - visualViewport.height / 2;\n cache.initialOffset = Math.max(Math.round(halfScreenOffset), 0);\n } else {\n cache.initialOffset = 0;\n }\n }\n return cache.initialOffset ?? 0;\n },\n /**\n * Расстояние между верхним краем боттомшита и границей вьюпорта\n */\n get remainingAvailableHeight() {\n if (!('remainingAvailableHeight' in cache) && grabberRef.current !== null) {\n cache.remainingAvailableHeight = grabberRef.current.offsetTop;\n }\n return cache.remainingAvailableHeight ?? 0;\n },\n invalidateCache() {\n cache = {};\n },\n };\n })()\n );\n\n const setCSSVariable = (name: string, value: string) =>\n cssVariablesContainerRef.current !== null && cssVariablesContainerRef.current.style.setProperty(name, value);\n\n useEffect(() => {\n if (!currentVisible) {\n return void 0;\n }\n\n DOCUMENT_HEIGHT.current = document.documentElement.clientHeight;\n if (visualViewport !== null) {\n SWIPE_THRESHOLD.current = { max: Math.round(visualViewport.height * 0.8) };\n }\n\n if (!showOverlay) {\n const enableOverscroll = disableOverscroll();\n return enableOverscroll;\n }\n\n const enableScroll = disableScroll();\n return enableScroll;\n }, [currentVisible, showOverlay]);\n\n useEffect(() => {\n const animationTimeoutElement = document.createElement('div');\n animationTimeoutElement.classList.add(styles.animationTimeout);\n document.body.appendChild(animationTimeoutElement);\n const style = window.getComputedStyle(animationTimeoutElement);\n const enter = toNumber(style.getPropertyValue(CSS_VAR_ENTER_ANIMATION_DURATION));\n const exit = toNumber(style.getPropertyValue(CSS_VAR_EXIT_ANIMATION_DURATION));\n const height = toNumber(style.getPropertyValue(CSS_VAR_HEIGHT_ANIMATION_DURATION));\n document.body.removeChild(animationTimeoutElement);\n setAnimationTimeout({ appear: { enter, exit }, height: { enter: height, exit } });\n }, [setAnimationTimeout]);\n\n useEffect(() => {\n if (!currentVisible || deviceFlagsRef.current.isSafari) {\n return;\n }\n\n // используем Virtual Keyboard API через meta-тег вместо navigator.virtualKeyboard,\n // потому что второй способ работает только на страницах, открытых через HTTPS, что мешает тестированию\n let meta = document.querySelector('meta[name=\"viewport\"]');\n if (!meta) {\n meta = document.createElement('meta');\n meta.setAttribute('name', 'viewport');\n document.head.appendChild(meta);\n }\n const attributesStr = meta.getAttribute('content');\n const attributes = (\n attributesStr !== null\n ? Object.fromEntries(attributesStr.split(',').map((keyValuePairStr) => keyValuePairStr.split('=')))\n : {}\n ) as Record<string, string>;\n attributes['interactive-widget'] = keyboardOverlaysContent ? 'resizes-visual' : 'resizes-content';\n const attributesStrUpdated = Object.entries(attributes)\n .map((keyValuePair) => keyValuePair.join('='))\n .join(',');\n meta.setAttribute('content', attributesStrUpdated);\n }, [currentVisible, keyboardOverlaysContent]);\n\n const recalcKeyboardOffsets = useCallback(() => {\n if (!overlayRef.current || !visualViewport) {\n return;\n }\n\n if (stateRef.current.hasFocus && focusedElementRef.current !== null) {\n // терминология: https://developer.chrome.com/blog/viewport-resize-behavior/\n //\n // делим браузеры на три группы в зависимости от поведения при открытии виртуальной клавиатуры:\n // 1. Safari — ресайзит Visual Viewport, не меняет Layout Viewport.\n // В нем не нужно ничего корректировать при keyboardOverlaysContent=true,\n // а при keyboardOverlaysContent=false нужно сдвинуть НИЖНИЙ край контейнера ВВЕРХ,\n // чтобы он совпал с границей Visual Viewport\n // 2. Chrome < 108 & Chromium-based — ресайзит и Visual Viewport, и Layout Viewport.\n // В нем не нужно ничего корректировать при keyboardOverlaysContent=false,\n // а при keyboardOverlaysContent=true нужно сдвинуть НИЖНИЙ край контейнера ВНИЗ,\n // чтобы футер уехал под клавиатуру\n // 3. Chrome >= 108 — поддерживает Virtual Keyboard API и meta-тег interactive-widget.\n // Используем поведение `resizes-visual` (как в Safari) в случае keyboardOverlaysContent=true\n // и `resizes-content` (как в Chrome < 108 & Chromium-based) в случае keyboardOverlaysContent=false\n // Таким образом в нем ничего не нужно корректировать\n\n const overlayDOMRect = overlayRef.current.getBoundingClientRect();\n\n // любой браузер может сдвинуть Visual Viewport вверх, если фокусируемый инпут находится близко к нижней границе\n // из-за этого может возникнуть проблема, что ВЕРХНИЙ край контента уехал за границу Visual Viewport\n // сдвигаем ВЕРХНИЙ край контейнера ВНИЗ, чтобы он совпал с границей Visual Viewport\n const visualViewportShift = Math.round(-overlayDOMRect.top);\n\n // keyboardOverlaysContent=true, клавиатура ПОВЕРХ контента\n // этот кейс нужно корректировать только в Chrome < 108 & Chromium-based\n if (keyboardOverlaysContent) {\n // браузеры из этой группы меняют Layout Viewport\n const layoutViewportDiff = Math.round(DOCUMENT_HEIGHT.current - document.documentElement.clientHeight);\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET, `${visualViewportShift}px`);\n if (layoutViewportDiff > 0) {\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET, `${visualViewportShift}px`);\n // сдвигаем НИЖНИЙ край контейнера ВНИЗ, чтобы футер уехал под клавиатуру\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET, `${-layoutViewportDiff}px`);\n\n // при этом может возникнуть проблема, что клавиатура перекрыла инпут\n // проверяем это и компенсируем величину перекрытия при необходимости\n const focusedElementOutOfViewportHeight = Math.round(\n focusedElementRef.current.getBoundingClientRect().bottom +\n layoutViewportDiff -\n DOCUMENT_HEIGHT.current\n );\n if (focusedElementOutOfViewportHeight > 0) {\n setCSSVariable(\n CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET,\n `${focusedElementOutOfViewportHeight - layoutViewportDiff}px`\n );\n }\n }\n }\n\n // keyboardOverlaysContent=false, клавиатура ПОД контентом\n // этот кейс нужно корректировать только в Safari\n if (!keyboardOverlaysContent && deviceFlagsRef.current.isSafari) {\n const visualViewportDiff = Math.round(overlayDOMRect.bottom - visualViewport.height);\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET, `${visualViewportShift}px`);\n if (visualViewportDiff > 0) {\n // сдвигаем НИЖНИЙ край контейнера ВВЕРХ, чтобы он совпал с границей Visual Viewport\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET, `${visualViewportDiff}px`);\n }\n }\n } else {\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET, `0px`);\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET, `0px`);\n }\n }, [keyboardOverlaysContent]);\n\n const handleFocus: FocusEventHandler = useCallback(\n (event) => {\n const focusedElement = event.target;\n const initialViewportHeight = visualViewport?.height;\n const resizeRAFStart = performance.now();\n\n if (!isTextInputElement(focusedElement) || stateRef.current.resizeRAFHandle !== null) {\n return;\n }\n\n const handleResize = () => {\n if (stateRef.current.resizeRAFHandle !== null) {\n cancelAnimationFrame(stateRef.current.resizeRAFHandle);\n stateRef.current.resizeRAFHandle = null;\n }\n\n recalcKeyboardOffsets();\n\n if (!stateRef.current.hasFocus) {\n visualViewport?.removeEventListener('resize', handleResize);\n }\n };\n\n // если спамить фокус/блюр инпута, ивент visualViewport.resize может не долететь\n // поэтому проверяем изменение высоты в рекурсивном RAF\n const waitForResize = () => {\n if (performance.now() - resizeRAFStart > 1000 || visualViewport?.height !== initialViewportHeight) {\n visualViewport?.removeEventListener('resize', handleResize);\n stateRef.current.resizeRAFHandle = null;\n recalcKeyboardOffsets();\n } else {\n stateRef.current.resizeRAFHandle = requestAnimationFrame(waitForResize);\n }\n };\n\n const handleBlur = () => {\n if (deviceFlagsRef.current.isSafari) {\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET, `0px`);\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET, `0px`);\n }\n\n stateRef.current.hasFocus = false;\n if (stateRef.current.resizeRAFHandle !== null) {\n cancelAnimationFrame(stateRef.current.resizeRAFHandle);\n stateRef.current.resizeRAFHandle = null;\n }\n focusedElement.removeEventListener('blur', handleBlur);\n focusedElementRef.current = null;\n };\n\n stateRef.current.hasFocus = true;\n stateRef.current.resizeRAFHandle = requestAnimationFrame(waitForResize);\n visualViewport?.addEventListener('resize', handleResize);\n focusedElement.addEventListener('blur', handleBlur);\n focusedElementRef.current = focusedElement;\n },\n [recalcKeyboardOffsets]\n );\n\n // contentOverlay совпадает по границам с контентом боттомшита, но лежит вне боттомшита,\n // чтобы чайлды contentOverlay не обрезались границами боттомшита\n // например, снекбар, лежащий внутри contentOverlay, при смахивании может оказаться в любом месте экрана\n // поэтому позицию contentOverlay нужно синхронизировать\n const recalcContentOverlayPosition = useCallback(() => {\n if (\n contentOverlayRef.current !== null &&\n scrollContainerRef.current !== null &&\n visualContainerRef.current !== null\n ) {\n contentOverlayRef.current.style.top = `${LayoutMetrics.current.contentTop}px`;\n contentOverlayRef.current.style.height = `${LayoutMetrics.current.visibleContentHeight}px`;\n }\n }, []);\n\n const recalcScrollFlags = useCallback(() => {\n const scrollOffset = deviceFlagsRef.current.hasTouchSupport\n ? stateRef.current.scrollOffset\n : -(scrollContainerRef.current?.scrollTop ?? 0);\n\n if (dividerRef.current !== null) {\n const prevDividerVisible = stateRef.current.dividerVisible;\n const isNotScrolledToEnd =\n LayoutMetrics.current.contentHeight + scrollOffset > LayoutMetrics.current.visibleContentHeight;\n stateRef.current.dividerVisible =\n showDivider === 'always' || (showDivider === 'with-scroll' && isNotScrolledToEnd);\n if (stateRef.current.dividerVisible !== prevDividerVisible) {\n dividerRef.current.classList.toggle(styles.dividerVisible, stateRef.current.dividerVisible);\n }\n }\n\n if (grabberRef.current !== null) {\n const prevGrabberUnsafe = stateRef.current.grabberUnsafe;\n stateRef.current.grabberUnsafe =\n Math.round(Math.max(scrollOffset, 0) + stateRef.current.swipeOffset) ===\n LayoutMetrics.current.remainingAvailableHeight;\n if (stateRef.current.grabberUnsafe !== prevGrabberUnsafe) {\n grabberRef.current.classList.toggle(styles.grabberEnsureSafe, stateRef.current.grabberUnsafe);\n }\n }\n }, [showDivider]);\n\n // помещает боттомшит в позицию вне экрана снизу, которая может быть начальной либо конечной точкой анимации\n const setTransformToInvisible = useCallback(() => {\n LayoutMetrics.current.invalidateCache();\n\n if (overlayRef.current !== null) {\n overlayRef.current.style.opacity = `0`;\n }\n if (swipeContainerRef.current !== null) {\n swipeContainerRef.current.style.transform = translateY(LayoutMetrics.current.bottomSheetHeight);\n }\n\n requestAnimationFrame(recalcContentOverlayPosition);\n requestAnimationFrame(recalcScrollFlags);\n }, [recalcContentOverlayPosition, recalcScrollFlags]);\n\n // помещает боттомшит в дефолтную позицию на экране, которая может быть начальной либо конечной точкой анимации\n const setTransformToVisible = useCallback(() => {\n LayoutMetrics.current.invalidateCache();\n\n stateRef.current.scrollOffset = LayoutMetrics.current.initialOffset;\n\n if (overlayRef.current !== null) {\n overlayRef.current.style.opacity = `1`;\n }\n if (swipeContainerRef.current !== null) {\n swipeContainerRef.current.style.transform = translateY(\n LayoutMetrics.current.initialOffset + stateRef.current.swipeOffset\n );\n }\n if (footerRef.current !== null) {\n footerRef.current.style.transform = translateY(-LayoutMetrics.current.initialOffset);\n }\n\n requestAnimationFrame(recalcContentOverlayPosition);\n requestAnimationFrame(recalcScrollFlags);\n }, [recalcContentOverlayPosition, recalcScrollFlags]);\n\n const handleExitAnimationStart = useCallback(() => {\n setTransformToVisible();\n onBeforeExit?.();\n }, [setTransformToVisible, onBeforeExit]);\n\n const handleExitAnimationEnd = useCallback(() => {\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET, `0px`);\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET, `0px`);\n\n stateRef.current.resizeRAFHandle !== null && cancelAnimationFrame(stateRef.current.resizeRAFHandle);\n stateRef.current = makeInitialState();\n\n stateRef.current.exitHandlers.forEach((handler) => handler());\n stateRef.current.exitHandlers = [];\n onAfterExit?.();\n }, [onAfterExit]);\n\n const resetScrollPosition = useCallback(() => {\n if (deviceFlagsRef.current.hasTouchSupport) {\n stateRef.current.scrollOffset = LayoutMetrics.current.initialOffset;\n stateRef.current.swipeOffset = 0;\n\n if (contentRef.current !== null) {\n contentRef.current.style.transform = translateY(0);\n }\n if (swipeContainerRef.current !== null) {\n swipeContainerRef.current.style.transform = translateY(LayoutMetrics.current.initialOffset);\n }\n } else {\n scrollContainerRef.current?.scrollTo({ top: 0 });\n }\n }, []);\n\n const handleHeightAnimationStart = useCallback(() => {\n LayoutMetrics.current.invalidateCache();\n\n if (stateRef.current.heightAnimationDiff !== null && visualContainerRef.current !== null) {\n visualContainerRef.current.style.height = `${\n LayoutMetrics.current.bottomSheetHeight + stateRef.current.heightAnimationDiff\n }px`;\n }\n }, []);\n\n const handleHeightAnimationEnd = useCallback(() => {\n LayoutMetrics.current.invalidateCache();\n\n if (visualContainerRef.current !== null) {\n visualContainerRef.current.style.height = `${LayoutMetrics.current.bottomSheetHeight}px`;\n }\n\n stateRef.current.heightAnimationDiff = null;\n stateRef.current.heightAnimationCallback && requestAnimationFrame(stateRef.current.heightAnimationCallback);\n stateRef.current.heightAnimationCallback = null;\n setHeightAnimationRunning(false);\n\n requestAnimationFrame(recalcContentOverlayPosition);\n requestAnimationFrame(recalcScrollFlags);\n scrollContextProviderRef.current?.notify({\n scrollTop: 0,\n maxScrollTop: LayoutMetrics.current.contentHeight - LayoutMetrics.current.visibleContentHeight,\n });\n }, [setHeightAnimationRunning, recalcContentOverlayPosition, recalcScrollFlags]);\n\n const handleSwipeMove: SwipeEventHandler = useCallback(\n (event) => {\n if (\n (stateRef.current.touchAction !== null && stateRef.current.touchAction !== 'swipe') ||\n hasSelectedText()\n ) {\n return;\n }\n\n // храним неокругленное значение для translateY, чтобы анимация была плавнее\n let newSwipeOffset = stateRef.current.swipeOffset + event.deltaY;\n if (Math.round(newSwipeOffset) <= 0) {\n // боттомшит уперся в верхний край экрана, не даем свайпать дальше\n newSwipeOffset = 0;\n if (stateRef.current.touchAction === 'swipe') {\n stateRef.current.touchAction = 'complete';\n }\n } else {\n // свайп в процессе\n stateRef.current.touchAction = 'swipe';\n }\n\n if (stateRef.current.swipeOffset !== newSwipeOffset) {\n stateRef.current.swipeOffset = newSwipeOffset;\n\n if (swipeContainerRef.current !== null) {\n swipeContainerRef.current.style.transform = translateY(\n Math.max(stateRef.current.scrollOffset, 0) + newSwipeOffset\n );\n }\n\n recalcScrollFlags();\n }\n },\n [recalcScrollFlags]\n );\n\n const handleSwipeCancel: SwipeEventHandler = useCallback(() => {\n if (stateRef.current.touchAction === 'swipe') {\n stateRef.current.swipeOffset = 0;\n stateRef.current.touchAction = null;\n\n if (swipeContainerRef.current !== null) {\n swipeContainerRef.current.classList.add(styles.swipeCancelAnimation);\n const swipeContainer = swipeContainerRef.current;\n setTimeout(() => swipeContainer.classList.remove(styles.swipeCancelAnimation), 100);\n swipeContainerRef.current.style.transform = translateY(Math.max(stateRef.current.scrollOffset, 0));\n }\n\n recalcScrollFlags();\n }\n }, [recalcScrollFlags]);\n\n const handleSwipeEnd: SwipeEventHandler = useCallback(() => {\n if (stateRef.current.touchAction === 'swipe') {\n onCloseRef.current();\n }\n }, []);\n\n const swipeHandlers = useSwipeHandlers({\n thresholdYRef: SWIPE_THRESHOLD,\n onSwipeMove: handleSwipeMove,\n onSwipeEnd: handleSwipeEnd,\n onSwipeCancel: handleSwipeCancel,\n });\n\n const initTransformHandlers = useCallback(() => {\n const visualContainer = visualContainerRef.current;\n if (!visualContainer) {\n return void 0;\n }\n\n const handleScroll = (delta: number) => {\n if (\n LayoutMetrics.current.initialOffset !== 0 ||\n LayoutMetrics.current.contentHeight > LayoutMetrics.current.visibleContentHeight\n ) {\n // храним неокругленное значение для translateY, чтобы анимация была плавнее\n let newScrollOffset = stateRef.current.scrollOffset + delta;\n const roundedNewScrollOffset = Math.round(newScrollOffset);\n\n if (roundedNewScrollOffset >= LayoutMetrics.current.initialOffset) {\n // скролла нет (touchAction is null)\n // либо контент проскроллен в начало, тогда не даем скроллить дальше\n newScrollOffset = LayoutMetrics.current.initialOffset;\n if (stateRef.current.touchAction === 'scroll') {\n stateRef.current.touchAction = 'complete';\n }\n } else if (\n LayoutMetrics.current.contentHeight + roundedNewScrollOffset <=\n LayoutMetrics.current.visibleContentHeight\n ) {\n // скролла нет (touchAction is null)\n // либо контент проскроллен до конца, тогда не даем скроллить дальше\n newScrollOffset = LayoutMetrics.current.visibleContentHeight - LayoutMetrics.current.contentHeight;\n if (stateRef.current.touchAction === 'scroll') {\n stateRef.current.touchAction = 'complete';\n }\n } else {\n // скролл в процессе\n stateRef.current.touchAction = 'scroll';\n }\n\n if (stateRef.current.scrollOffset !== newScrollOffset) {\n const offsetWasPositive = stateRef.current.scrollOffset > 0;\n stateRef.current.scrollOffset = newScrollOffset;\n\n if (contentRef.current !== null && swipeContainerRef.current !== null) {\n if (newScrollOffset > 0) {\n if (!offsetWasPositive) {\n contentRef.current.style.transform = translateY(0);\n }\n swipeContainerRef.current.style.transform = translateY(newScrollOffset);\n if (footerRef.current !== null) {\n footerRef.current.style.transform = translateY(-newScrollOffset);\n }\n } else {\n contentRef.current.style.transform = translateY(newScrollOffset);\n if (offsetWasPositive) {\n swipeContainerRef.current.style.transform = translateY(0);\n if (footerRef.current !== null) {\n footerRef.current.style.transform = translateY(0);\n }\n }\n }\n }\n\n recalcScrollFlags();\n scrollContextProviderRef.current?.notify({\n scrollTop: Math.max(-stateRef.current.scrollOffset, 0),\n maxScrollTop: LayoutMetrics.current.contentHeight - LayoutMetrics.current.visibleContentHeight,\n });\n }\n }\n };\n\n let focusedElementTouchY: number | null = null;\n\n const onTouchMove = (event: ScrollGestureEvent) => {\n if (\n (!allowScrollWhileFocused && stateRef.current.hasFocus) ||\n (stateRef.current.touchAction !== null && stateRef.current.touchAction !== 'scroll') ||\n hasSelectedText() ||\n (focusedElementRef.current !== null && focusedElementTouchY !== null)\n ) {\n return;\n }\n handleScroll(event.delta);\n };\n\n const onTouchEnd = () => {\n if (focusedElementTouchY !== null) {\n focusedElementTouchY = null;\n }\n if (stateRef.current.touchAction === 'scroll') {\n stateRef.current.touchAction = null;\n }\n };\n\n const handleTouchStart = (event: TouchEvent) => {\n if (stateRef.current.touchAction === 'complete') {\n stateRef.current.touchAction = null;\n }\n if (event.target === focusedElementRef.current && focusedElementRef.current !== null) {\n focusedElementTouchY = event.changedTouches[0].pageY;\n } else {\n focusedElementTouchY = null;\n swipeHandlers.onTouchStart(event);\n }\n };\n\n const handleTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (focusedElementRef.current !== null && focusedElementTouchY !== null) {\n focusedElementRef.current.scrollTop += focusedElementTouchY - event.changedTouches[0].pageY;\n focusedElementTouchY = event.changedTouches[0].pageY;\n } else {\n swipeHandlers.onTouchMove(event);\n }\n };\n\n const removeScrollHandlers = initScrollHandlers({\n axis: 'vertical',\n wrapperRef: visualContainerRef,\n onTouchMove,\n onTouchEnd,\n });\n visualContainer.addEventListener('touchstart', handleTouchStart);\n visualContainer.addEventListener('touchmove', handleTouchMove);\n visualContainer.addEventListener('touchend', swipeHandlers.onTouchEnd);\n visualContainer.addEventListener('touchcancel', swipeHandlers.onTouchCancel);\n\n return () => {\n removeScrollHandlers();\n visualContainer.removeEventListener('touchstart', handleTouchStart);\n visualContainer.removeEventListener('touchmove', handleTouchMove);\n visualContainer.removeEventListener('touchend', swipeHandlers.onTouchEnd);\n visualContainer.removeEventListener('touchcancel', swipeHandlers.onTouchCancel);\n };\n }, [allowScrollWhileFocused, recalcScrollFlags, swipeHandlers]);\n\n // при изменении высоты контента анимируем ее\n // задаем боттомшиту фиксированную высоту и пересчитываем ее самостоятельно,\n // чтобы не было мерцания, когда новый контент отрисовался до срабатывания колбека ResizeObserver\n const initHeightObserver = useCallback(() => {\n const visualContainer = visualContainerRef.current;\n if (!visualContainer) {\n return void 0;\n }\n\n let prevContentHeight = 0;\n let prevHeaderHeight = 0;\n let prevFooterHeight = 0;\n let prevVisibleContentHeight = 0;\n let skipFirstResizeCallback = true;\n let collapseResizeCallbacks = false;\n\n const handleHeightChange = () => {\n LayoutMetrics.current.invalidateCache();\n\n if (skipFirstResizeCallback) {\n visualContainer.style.height = `${LayoutMetrics.current.bottomSheetHeight}px`;\n prevHeaderHeight = LayoutMetrics.current.headerHeight;\n prevContentHeight = LayoutMetrics.current.contentHeight;\n prevFooterHeight = LayoutMetrics.current.footerHeight;\n prevVisibleContentHeight = LayoutMetrics.current.visibleContentHeight;\n\n skipFirstResizeCallback = false;\n return;\n }\n\n if (stateRef.current.heightAnimationDiff !== null) {\n if (!collapseResizeCallbacks) {\n // если предыдущая анимация не завершилась, без анимации сбрасываем высоту на вычисленную браузером\n visualContainer.style.height = ``;\n }\n } else {\n const contentHeightDiff = LayoutMetrics.current.contentHeight - prevContentHeight;\n const containersHeightDiff =\n LayoutMetrics.current.headerHeight -\n prevHeaderHeight +\n LayoutMetrics.current.footerHeight -\n prevFooterHeight;\n\n // предположим, что scrollContainer останется таким же или станет меньше\n // тогда можем рассчитать минимальную видимую высоту контента как min(scrollContainer.height, contentHeight)\n const _prevVisibleContentHeight = Math.min(prevVisibleContentHeight, prevContentHeight);\n const newMinVisibleContentHeight = Math.min(\n prevVisibleContentHeight - containersHeightDiff,\n LayoutMetrics.current.contentHeight\n );\n const minVisibleContentHeightDiff = newMinVisibleContentHeight - _prevVisibleContentHeight;\n\n // предположим, что scrollContainer станет больше\n // тогда контент не может увеличиться больше, чем на расстояние между боттомшитом и верхним краем экрана\n const maxVisibleContentHeightDiff =\n LayoutMetrics.current.remainingAvailableHeight - containersHeightDiff;\n\n const visibleContentHeightDiff = Math.min(\n Math.max(contentHeightDiff, minVisibleContentHeightDiff),\n maxVisibleContentHeightDiff\n );\n if (visibleContentHeightDiff !== 0) {\n resetScrollPosition();\n } else if (deviceFlagsRef.current.hasTouchSupport) {\n // если высота видимой части контента не изменилась,\n // но позиция скролла превысила максимально допустимую из-за уменьшения высоты контента,\n // сбрасываем позицию скролла на максимально допустимую\n const isOverscrolled =\n LayoutMetrics.current.contentHeight + stateRef.current.scrollOffset <\n LayoutMetrics.current.visibleContentHeight;\n if (isOverscrolled) {\n stateRef.current.scrollOffset =\n LayoutMetrics.current.visibleContentHeight - LayoutMetrics.current.contentHeight;\n if (contentRef.current !== null) {\n contentRef.current.style.transform = translateY(stateRef.current.scrollOffset);\n }\n scrollContextProviderRef.current?.notify({ scrollTop: -stateRef.current.scrollOffset });\n }\n }\n\n const heightAnimationDiff = visibleContentHeightDiff + containersHeightDiff;\n if (heightAnimationDiff !== 0) {\n // запоминаем высоту scrollContainer после того, как боттомшиту будет присвоена новая высота.\n // до этого значение некорректно, т.к. новый контент уже был отрендерен,\n // но в инлайн-стилях боттомшита остается старая высота\n stateRef.current.heightAnimationDiff = heightAnimationDiff;\n stateRef.current.heightAnimationCallback = () => {\n prevVisibleContentHeight = LayoutMetrics.current.visibleContentHeight;\n };\n\n setHeightAnimationRunning(true);\n\n collapseResizeCallbacks = true;\n requestAnimationFrame(() => {\n collapseResizeCallbacks = false;\n });\n } else {\n recalcContentOverlayPosition();\n recalcScrollFlags();\n }\n }\n\n prevHeaderHeight = LayoutMetrics.current.headerHeight;\n prevContentHeight = LayoutMetrics.current.contentHeight;\n prevFooterHeight = LayoutMetrics.current.footerHeight;\n };\n\n const resizeObserver = new ResizeObserver(handleHeightChange);\n const content = contentRef.current;\n const footer = footerRef.current;\n const header = headerRef.current;\n\n content !== null && resizeObserver.observe(content);\n footer !== null && resizeObserver.observe(footer);\n header !== null && header.addHeightObserver(handleHeightChange);\n\n return () => {\n resizeObserver.disconnect();\n header !== null && header.removeHeightObserver(handleHeightChange);\n };\n }, [setHeightAnimationRunning, recalcScrollFlags, recalcContentOverlayPosition, resetScrollPosition]);\n\n const handleAppearAnimationEnd = useCallback(() => {\n const removeHeightObserver = initHeightObserver();\n removeHeightObserver && stateRef.current.exitHandlers.push(removeHeightObserver);\n\n const removeTransformHandlers = deviceFlagsRef.current.hasTouchSupport && initTransformHandlers();\n removeTransformHandlers && stateRef.current.exitHandlers.push(removeTransformHandlers);\n\n onAppearRef.current?.();\n }, [initHeightObserver, initTransformHandlers]);\n\n const { onTouchEnd, ...eventHandlers } = useNoBubbling();\n\n if (!animationTimeout) {\n return null;\n }\n\n const renderFunc = (appearTransition: TransitionStatus, heightTransition: TransitionStatus) => {\n const navigationBar =\n header && isNavigationBarComponent(header) ? (\n <NavigationBarComponent {...header.props} forwardedRef={headerRef} />\n ) : null;\n\n const content = (\n <div\n className={classnames(styles.content, {\n [styles.contentFullScreen]: height === 'full-screen',\n [styles.contentWithPaddings]: withContentPaddings,\n [styles.contentWithoutHeader]: !header,\n [styles.contentSizedFullScreen]: isContentSizedFullHeight,\n })}\n ref={contentRef}\n >\n <BottomSheetContext.Provider value={bottomSheetContext}>{children}</BottomSheetContext.Provider>\n </div>\n );\n\n const scrollContainer = deviceFlagsRef.current.hasTouchSupport ? (\n <CustomScrollContextProvider ref={scrollContextProviderRef}>\n <div className={styles.scrollContainer} onFocus={handleFocus} ref={scrollContainerRef}>\n {navigationBar}\n {content}\n </div>\n </CustomScrollContextProvider>\n ) : (\n <div\n className={classnames(styles.scrollContainer, styles.nativeScrollContainer)}\n onFocus={handleFocus}\n onScroll={recalcScrollFlags}\n ref={scrollContainerRef}\n >\n {navigationBar}\n {content}\n </div>\n );\n\n const clonedFooter =\n footer && isActionBarComponent(footer)\n ? cloneElement(footer, { type: footer.props.type || 'mobile', showDivider: false })\n : footer;\n\n return (\n <Layer layer=\"bottom-sheet\">\n <div {...eventHandlers} className={styles.overlay}>\n <div\n className={classnames(styles.overlayBackground, {\n [styles.overlayBackgroundVisible]: showOverlay,\n [styles.appearAnimation]: appearTransition === 'entering',\n [styles.disappearAnimation]: appearTransition === 'exiting',\n })}\n {...(appearTransition === 'entered'\n ? { 'data-qa': 'bottom-sheet-overlay', onClick: onCloseRef.current }\n : {})}\n ref={overlayRef}\n />\n <div\n className={classnames(styles.swipeContainer, {\n [styles.appearAnimation]: appearTransition === 'entering',\n [styles.closeBySwipeAnimation]:\n appearTransition === 'exiting' && stateRef.current.touchAction === 'swipe',\n [styles.disappearAnimation]: appearTransition === 'exiting',\n })}\n data-qa={appearTransition === 'entered' ? 'bottom-sheet-container' : undefined}\n ref={swipeContainerRef}\n >\n <div\n className={classnames(styles.grabber, styles.grabberTransitionAnimation, {\n [styles.grabberEnsureSafe]: stateRef.current.grabberUnsafe,\n })}\n ref={grabberRef}\n />\n <div\n className={classnames(styles.visualContainer, {\n [styles.visualContainerFullScreen]: height === 'full-screen',\n [styles.heightTransitionAnimation]: heightTransition === 'entering',\n })}\n data-qa={appearTransition === 'entered' ? 'bottom-sheet-content' : undefined}\n ref={bottomSheetRef}\n >\n {scrollContainer}\n <div className={styles.footer} ref={footerRef}>\n {footer && (\n <div\n className={classnames(styles.divider, {\n [styles.dividerVisible]: stateRef.current.dividerVisible,\n })}\n ref={dividerRef}\n >\n <Divider />\n </div>\n )}\n {interceptClickHandlers && deviceFlagsRef.current.hasTouchSupport ? (\n <ClickInterceptor>{clonedFooter}</ClickInterceptor>\n ) : (\n clonedFooter\n )}\n </div>\n </div>\n <div className={styles.contentOverlay} ref={contentOverlayRef} />\n </div>\n </div>\n </Layer>\n );\n };\n\n return createPortal(\n <div\n className={styles.cssVariablesContainer}\n data-qa=\"bottom-sheet-css-variables\"\n ref={cssVariablesContainerRef}\n >\n <Transition\n appear\n in={currentVisible}\n mountOnEnter\n onEnter={setTransformToInvisible}\n onEntering={setTransformToVisible}\n onEntered={handleAppearAnimationEnd}\n onExit={handleExitAnimationStart}\n onExiting={setTransformToInvisible}\n onExited={handleExitAnimationEnd}\n timeout={animationTimeout.appear}\n unmountOnExit\n nodeRef={contentRef}\n >\n {(appearTransition) => (\n <Transition\n in={heightAnimationRunning}\n onEnter={handleHeightAnimationStart}\n onEntered={handleHeightAnimationEnd}\n timeout={animationTimeout.height}\n nodeRef={contentRef}\n >\n {(heightTransition) => renderFunc(appearTransition, heightTransition)}\n </Transition>\n )}\n </Transition>\n </div>,\n document.body\n );\n};\n\nexport const BottomSheet = forwardRef(BottomSheetRenderFunc);\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"BottomSheet.js","sources":["../src/BottomSheet.tsx"],"sourcesContent":["import {\n FocusEventHandler,\n ForwardRefRenderFunction,\n forwardRef,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n cloneElement,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { Transition, TransitionStatus } from 'react-transition-group';\nimport classnames from 'classnames';\n\nimport { useEscapeToClose } from '@hh.ru/magritte-common-keyboard';\nimport { disableOverscroll, disableScroll } from '@hh.ru/magritte-common-modal-helper';\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { useNoBubbling } from '@hh.ru/magritte-common-use-no-bubbling';\nimport { useSwipeHandlers, SwipeEventHandler } from '@hh.ru/magritte-common-use-swipe';\nimport {\n ScrollGestureEvent,\n CustomScrollContextNotifier,\n CustomScrollContextProvider,\n initScrollHandlers,\n} from '@hh.ru/magritte-internal-custom-scroll';\nimport { isActionBarComponent } from '@hh.ru/magritte-ui-action-bar';\nimport { BottomSheetContext } from '@hh.ru/magritte-ui-bottom-sheet/BottomSheetContext';\nimport { ClickInterceptor } from '@hh.ru/magritte-ui-bottom-sheet/ClickInterceptor';\nimport { BottomSheetProps } from '@hh.ru/magritte-ui-bottom-sheet/types';\nimport { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';\nimport { Divider } from '@hh.ru/magritte-ui-divider';\nimport { Layer } from '@hh.ru/magritte-ui-layer';\nimport {\n NavigationBarComponent,\n NavigationBarComponentRef,\n isNavigationBarComponent,\n} from '@hh.ru/magritte-ui-navigation-bar';\nimport { isValidTreeSelectorWrapper } from '@hh.ru/magritte-ui-tree-selector';\n\nimport styles from './bottom-sheet.less';\n\nconst CSS_VAR_ENTER_ANIMATION_DURATION = '--enter-animation-duration';\nconst CSS_VAR_EXIT_ANIMATION_DURATION = '--exit-animation-duration';\nconst CSS_VAR_HEIGHT_ANIMATION_DURATION = '--height-transition-duration';\nconst CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET = '--virtual-keyboard-top-offset';\nconst CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET = '--virtual-keyboard-bottom-offset';\n\nconst checkSafari = () => /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\nconst hasSelectedText = () => {\n const selection = document.getSelection();\n return !!selection && !selection.isCollapsed;\n};\n\nconst toNumber = (value: string) => {\n const result = parseInt(value, 10);\n return Number.isInteger(result) ? result : 0;\n};\n\nconst textInputTypes = ['text', 'password', 'email', 'search', 'tel', 'url', 'number'];\nconst isTextInputElement = (element: Element): element is HTMLInputElement => {\n if (element instanceof HTMLInputElement) {\n return textInputTypes.includes(element.type);\n } else if (element instanceof HTMLTextAreaElement) {\n return true;\n }\n\n return false;\n};\n\nconst translateY = (value: number) => `translate3d(0, ${value}px, 0)`;\n\ntype AnimationTimeout = { [AnimationType in 'appear' | 'height']: { [AnimationStage in 'enter' | 'exit']: number } };\n\ntype State = {\n dividerVisible: boolean;\n // если боттомшит упирается в верхний край экрана, челка может перекрыть граббер и его нужно переместить в safe area\n grabberUnsafe: boolean;\n hasFocus: boolean;\n resizeRAFHandle: ReturnType<typeof requestAnimationFrame> | null;\n // translateY для эмуляции скролла, отрицательный либо меньше LayoutMetrics.current.initialOffset\n scrollOffset: number;\n // translateY для эмуляции свайпа, всегда положительный либо 0\n swipeOffset: number;\n // текущее действие, инициированное пользователем\n touchAction:\n | null // может быть начато любое действие\n | 'complete' // палец приложен, но действие завершено — не реагируем на тач, пока пользователь не отпустит палец\n | 'scroll' // палец приложен, скроллим контент внутри боттомшита\n | 'swipe'; // палец приложен, свайпаем весь боттомшит вниз, чтобы закрыть его, или вверх, чтобы отменить свайп\n exitHandlers: Array<VoidFunction>;\n // число, на которое нужно анимировать изменение высоты контента боттомшита\n heightAnimationDiff: number | null;\n heightAnimationCallback?: VoidFunction | null;\n};\n\nconst makeInitialState = (): State => ({\n dividerVisible: false,\n grabberUnsafe: false,\n hasFocus: false,\n resizeRAFHandle: null,\n scrollOffset: 0,\n swipeOffset: 0,\n touchAction: null,\n exitHandlers: [],\n heightAnimationDiff: null,\n});\n\nconst BottomSheetRenderFunc: ForwardRefRenderFunction<HTMLElement, BottomSheetProps> = (\n {\n allowScrollWhileFocused,\n children,\n footer,\n header,\n height = 'content',\n interceptClickHandlers = true,\n keyboardOverlaysFooter = true,\n onAppear,\n onBeforeExit,\n onAfterExit,\n onClose,\n showDivider = 'with-scroll',\n showOverlay = true,\n visible = false,\n withContentPaddings = true,\n },\n ref\n) => {\n const DOCUMENT_HEIGHT = useRef(0);\n const SWIPE_THRESHOLD = useRef({ max: Infinity });\n\n const contentRef = useRef<HTMLDivElement>(null);\n const contentOverlayRef = useRef<HTMLDivElement>(null);\n const cssVariablesContainerRef = useRef<HTMLDivElement>(null);\n const dividerRef = useRef<HTMLDivElement>(null);\n const focusedElementRef = useRef<HTMLInputElement | HTMLTextAreaElement | null>(null);\n const footerRef = useRef<HTMLDivElement>(null);\n const grabberRef = useRef<HTMLDivElement>(null);\n const headerRef = useRef<NavigationBarComponentRef>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const swipeContainerRef = useRef<HTMLDivElement>(null);\n const visualContainerRef = useRef<HTMLDivElement>(null);\n const bottomSheetRef = useMultipleRefs(ref, visualContainerRef);\n const scrollContextProviderRef = useRef<CustomScrollContextNotifier>(null);\n\n const currentVisible = useBreakpoint().isMobile && visible;\n const onAppearRef = useRef(onAppear);\n onAppearRef.current = onAppear;\n const onCloseRef = useRef(onClose);\n onCloseRef.current = onClose;\n const stateRef = useRef<State>(makeInitialState());\n const [animationTimeout, setAnimationTimeout] = useState<AnimationTimeout | null>(null);\n const [heightAnimationRunning, setHeightAnimationRunning] = useState(false);\n const bottomSheetContext = useMemo(() => ({ contentOverlayRef }), [contentOverlayRef]);\n const isContentSizedFullHeight = isValidTreeSelectorWrapper(children);\n const virtualKeyboardOffsetsRef = useRef<{ top: number; bottom: number }>({ top: 0, bottom: 0 });\n\n const [isSafari, setIsSafari] = useState<boolean | null>(null);\n useEffect(() => setIsSafari(checkSafari()), [setIsSafari]);\n\n const [hasTouchSupport, setHasTouchSupport] = useState<boolean | null>(null);\n const hasTouchSupportRef = useRef<boolean | null>(null);\n useEffect(() => {\n if (!('matchMedia' in window)) {\n return void 0;\n }\n const mediaQuery = window.matchMedia('(pointer:coarse)');\n const handleMediaQueryChange = () => {\n hasTouchSupportRef.current = mediaQuery.matches;\n setHasTouchSupport(hasTouchSupportRef.current);\n };\n mediaQuery.addEventListener('change', handleMediaQueryChange);\n hasTouchSupportRef.current = mediaQuery.matches;\n setHasTouchSupport(hasTouchSupportRef.current);\n return () => mediaQuery.removeEventListener('change', handleMediaQueryChange);\n }, [setHasTouchSupport]);\n\n const bindEscapeToClose = useEscapeToClose(() => currentVisible && onClose?.());\n useEffect(() => bindEscapeToClose(document.body), [bindEscapeToClose]);\n\n const LayoutMetrics = useRef(\n (() => {\n let cache: Record<string, number> = {};\n return {\n get bottomSheetHeight() {\n if (!('bottomSheetHeight' in cache) && visualContainerRef.current !== null) {\n cache.bottomSheetHeight = visualContainerRef.current.clientHeight;\n }\n return cache.bottomSheetHeight ?? 0;\n },\n /**\n * Высота контента\n * Может превышать высоту контейнера из-за скролла\n */\n get contentHeight() {\n if (!('contentHeight' in cache) && contentRef.current !== null) {\n cache.contentHeight = contentRef.current.clientHeight;\n }\n return cache.contentHeight ?? 0;\n },\n /**\n * Высота видимой части контента\n */\n get visibleContentHeight() {\n if (!('visibleContentHeight' in cache) && scrollContainerRef.current !== null) {\n const layoutHeaderHeight = headerRef.current?.layoutHeight ?? 0;\n cache.visibleContentHeight = scrollContainerRef.current.clientHeight - layoutHeaderHeight;\n }\n return cache.visibleContentHeight ?? 0;\n },\n /**\n * Положение верхнего края видимой части контента относительно вьюпорта\n */\n get contentTop() {\n if (!('contentTop' in cache) && visualContainerRef.current !== null) {\n const visibleHeaderHeight = headerRef.current?.visibleHeight ?? 0;\n cache.contentTop = visualContainerRef.current.offsetTop + visibleHeaderHeight;\n }\n return cache.contentTop ?? 0;\n },\n get footerHeight() {\n if (!('footerHeight' in cache) && footerRef.current !== null) {\n cache.footerHeight = footerRef.current.clientHeight;\n }\n return cache.footerHeight ?? 0;\n },\n /**\n * Фактическая высота, которую NavigationBar занимает в боттомшите\n * Может отличаться от видимой высоты NavigationBar\n */\n get headerHeight() {\n if (!('headerHeight' in cache) && headerRef.current !== null) {\n cache.headerHeight = headerRef.current.layoutHeight;\n }\n return cache.headerHeight ?? 0;\n },\n get initialOffset() {\n if (!('initialOffset' in cache)) {\n if (\n height === 'half-screen' &&\n hasTouchSupportRef.current &&\n visualContainerRef.current !== null &&\n visualViewport !== null\n ) {\n const halfScreenOffset =\n visualContainerRef.current.clientHeight - visualViewport.height / 2;\n cache.initialOffset = Math.max(Math.round(halfScreenOffset), 0);\n } else {\n cache.initialOffset = 0;\n }\n }\n return cache.initialOffset ?? 0;\n },\n get maxScrollTop() {\n return LayoutMetrics.current.contentHeight - LayoutMetrics.current.visibleContentHeight;\n },\n /**\n * Расстояние между верхним краем боттомшита и границей вьюпорта\n */\n get remainingAvailableHeight() {\n if (!('remainingAvailableHeight' in cache) && grabberRef.current !== null) {\n cache.remainingAvailableHeight = grabberRef.current.offsetTop;\n }\n return cache.remainingAvailableHeight ?? 0;\n },\n invalidateCache() {\n cache = {};\n },\n };\n })()\n );\n\n const setCSSVariable = (name: string, value: string) =>\n cssVariablesContainerRef.current !== null && cssVariablesContainerRef.current.style.setProperty(name, value);\n\n useEffect(() => {\n if (!currentVisible) {\n return void 0;\n }\n\n DOCUMENT_HEIGHT.current = document.documentElement.clientHeight;\n if (visualViewport !== null) {\n SWIPE_THRESHOLD.current = { max: Math.round(visualViewport.height * 0.8) };\n }\n\n if (!showOverlay) {\n const enableOverscroll = disableOverscroll();\n return enableOverscroll;\n }\n\n const enableScroll = disableScroll();\n return enableScroll;\n }, [currentVisible, showOverlay]);\n\n useEffect(() => {\n const animationTimeoutElement = document.createElement('div');\n animationTimeoutElement.classList.add(styles.animationTimeout);\n document.body.appendChild(animationTimeoutElement);\n const style = window.getComputedStyle(animationTimeoutElement);\n const enter = toNumber(style.getPropertyValue(CSS_VAR_ENTER_ANIMATION_DURATION));\n const exit = toNumber(style.getPropertyValue(CSS_VAR_EXIT_ANIMATION_DURATION));\n const height = toNumber(style.getPropertyValue(CSS_VAR_HEIGHT_ANIMATION_DURATION));\n document.body.removeChild(animationTimeoutElement);\n setAnimationTimeout({ appear: { enter, exit }, height: { enter: height, exit } });\n }, [setAnimationTimeout]);\n\n useEffect(() => {\n if (!currentVisible || isSafari) {\n return;\n }\n\n // используем Virtual Keyboard API через meta-тег вместо navigator.virtualKeyboard,\n // потому что второй способ работает только на страницах, открытых через HTTPS, что мешает тестированию\n let meta = document.querySelector('meta[name=\"viewport\"]');\n if (!meta) {\n meta = document.createElement('meta');\n meta.setAttribute('name', 'viewport');\n document.head.appendChild(meta);\n }\n const attributesStr = meta.getAttribute('content');\n const attributes = (\n attributesStr !== null\n ? Object.fromEntries(attributesStr.split(',').map((keyValuePairStr) => keyValuePairStr.split('=')))\n : {}\n ) as Record<string, string>;\n attributes['interactive-widget'] = keyboardOverlaysFooter ? 'resizes-visual' : 'resizes-content';\n const attributesStrUpdated = Object.entries(attributes)\n .map((keyValuePair) => keyValuePair.join('='))\n .join(',');\n meta.setAttribute('content', attributesStrUpdated);\n }, [currentVisible, isSafari, keyboardOverlaysFooter]);\n\n const fixOverscroll = useCallback(() => {\n if (hasTouchSupport) {\n const isOverscrolled =\n LayoutMetrics.current.contentHeight + stateRef.current.scrollOffset <\n LayoutMetrics.current.visibleContentHeight;\n if (isOverscrolled) {\n stateRef.current.scrollOffset =\n LayoutMetrics.current.visibleContentHeight - LayoutMetrics.current.contentHeight;\n if (contentRef.current !== null) {\n contentRef.current.style.transform = translateY(stateRef.current.scrollOffset);\n }\n scrollContextProviderRef.current?.notify({\n scrollTop: -stateRef.current.scrollOffset,\n maxScrollTop: LayoutMetrics.current.maxScrollTop,\n });\n }\n }\n }, [hasTouchSupport]);\n\n const resetScrollPosition = useCallback(() => {\n if (hasTouchSupport) {\n stateRef.current.scrollOffset = LayoutMetrics.current.initialOffset;\n stateRef.current.swipeOffset = 0;\n\n if (contentRef.current !== null) {\n contentRef.current.style.transform = translateY(0);\n }\n if (swipeContainerRef.current !== null) {\n swipeContainerRef.current.style.transform = translateY(LayoutMetrics.current.initialOffset);\n }\n } else {\n scrollContainerRef.current?.scrollTo({ top: 0 });\n }\n }, [hasTouchSupport]);\n\n const recalcScrollFlags = useCallback(() => {\n const scrollOffset = hasTouchSupport\n ? stateRef.current.scrollOffset\n : -(scrollContainerRef.current?.scrollTop ?? 0);\n\n if (dividerRef.current !== null) {\n const prevDividerVisible = stateRef.current.dividerVisible;\n const isNotScrolledToEnd =\n LayoutMetrics.current.contentHeight + scrollOffset > LayoutMetrics.current.visibleContentHeight;\n stateRef.current.dividerVisible =\n showDivider === 'always' || (showDivider === 'with-scroll' && isNotScrolledToEnd);\n if (stateRef.current.dividerVisible !== prevDividerVisible) {\n dividerRef.current.classList.toggle(styles.dividerVisible, stateRef.current.dividerVisible);\n }\n }\n\n if (grabberRef.current !== null) {\n const prevGrabberUnsafe = stateRef.current.grabberUnsafe;\n stateRef.current.grabberUnsafe =\n Math.round(Math.max(scrollOffset, 0) + stateRef.current.swipeOffset) ===\n LayoutMetrics.current.remainingAvailableHeight;\n if (stateRef.current.grabberUnsafe !== prevGrabberUnsafe) {\n grabberRef.current.classList.toggle(styles.grabberEnsureSafe, stateRef.current.grabberUnsafe);\n }\n }\n }, [hasTouchSupport, showDivider]);\n\n // терминология: https://developer.chrome.com/blog/viewport-resize-behavior/\n //\n // при открытии виртуальной клавиатуры браузеры двигают Visual Viewport и Layout Viewport\n // с помощью двух отступов делаем так, чтобы overlay боттомшита совпадал с видимой частью экрана\n const recalcKeyboardOffsets = useCallback(() => {\n if (!hasTouchSupport || !contentRef.current || !overlayRef.current || !visualViewport) {\n return;\n }\n\n LayoutMetrics.current.invalidateCache();\n\n if (stateRef.current.hasFocus && focusedElementRef.current !== null) {\n const overlayDOMRect = overlayRef.current.getBoundingClientRect();\n\n // любой браузер может сдвинуть Visual Viewport вверх, если фокусируемый инпут находится близко к нижней границе\n // из-за этого может возникнуть проблема, что ВЕРХНИЙ край контента уехал за границу Visual Viewport\n // сдвигаем ВЕРХНИЙ край контейнера ВНИЗ, чтобы он совпал с границей Visual Viewport\n const topOffset = Math.round(-overlayDOMRect.top);\n\n let bottomOffset = 0;\n if (isSafari) {\n const visualViewportDiff = Math.round(overlayDOMRect.bottom - visualViewport.height);\n if (visualViewportDiff > 0) {\n // сдвигаем НИЖНИЙ край контейнера ВВЕРХ, чтобы он совпал с границей Visual Viewport\n bottomOffset = visualViewportDiff;\n }\n }\n\n if (keyboardOverlaysFooter && footerRef.current !== null) {\n bottomOffset -= footerRef.current.clientHeight;\n }\n\n if (\n topOffset !== virtualKeyboardOffsetsRef.current.top ||\n bottomOffset !== virtualKeyboardOffsetsRef.current.bottom\n ) {\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET, `${topOffset}px`);\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET, `${bottomOffset}px`);\n }\n\n LayoutMetrics.current.invalidateCache();\n\n // если фокусируемый элемент лежит внутри скроллящегося контейнера и не виден, скроллим к нему\n if (contentRef.current.contains(focusedElementRef.current)) {\n let focusedElementOffset = 0;\n for (\n let offsetElement: HTMLElement | null =\n focusedElementRef.current.closest('[data-interactive]') ?? focusedElementRef.current;\n offsetElement !== contentRef.current && offsetElement !== null;\n offsetElement = offsetElement.offsetParent as HTMLElement | null\n ) {\n focusedElementOffset += offsetElement.offsetTop;\n }\n const newScrollOffset = -Math.min(\n Math.max(focusedElementOffset - 10, 0),\n LayoutMetrics.current.maxScrollTop\n );\n if (stateRef.current.scrollOffset !== newScrollOffset) {\n stateRef.current.scrollOffset = newScrollOffset;\n contentRef.current.style.transform = translateY(stateRef.current.scrollOffset);\n\n scrollContextProviderRef.current?.notify({\n scrollTop: -stateRef.current.scrollOffset,\n maxScrollTop: LayoutMetrics.current.maxScrollTop,\n });\n }\n }\n\n recalcScrollFlags();\n\n virtualKeyboardOffsetsRef.current.top = topOffset;\n virtualKeyboardOffsetsRef.current.bottom = bottomOffset;\n } else {\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET, `0px`);\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET, `0px`);\n\n LayoutMetrics.current.invalidateCache();\n fixOverscroll();\n recalcScrollFlags();\n\n virtualKeyboardOffsetsRef.current.top = 0;\n virtualKeyboardOffsetsRef.current.bottom = 0;\n }\n }, [fixOverscroll, hasTouchSupport, isSafari, keyboardOverlaysFooter, recalcScrollFlags]);\n\n const handleFocus: FocusEventHandler = useCallback(\n (event) => {\n const focusedElement = event.target;\n const initialViewportHeight = visualViewport?.height;\n const resizeRAFStart = performance.now();\n\n if (!isTextInputElement(focusedElement) || stateRef.current.resizeRAFHandle !== null) {\n return;\n }\n\n const handleResize = () => {\n if (stateRef.current.resizeRAFHandle !== null) {\n cancelAnimationFrame(stateRef.current.resizeRAFHandle);\n stateRef.current.resizeRAFHandle = null;\n }\n\n recalcKeyboardOffsets();\n\n if (!stateRef.current.hasFocus) {\n visualViewport?.removeEventListener('resize', handleResize);\n visualViewport?.removeEventListener('scroll', handleResize);\n }\n };\n\n // если спамить фокус/блюр инпута, ивент visualViewport.resize может не долететь\n // поэтому проверяем изменение высоты в рекурсивном RAF\n const waitForResize = () => {\n if (performance.now() - resizeRAFStart > 1000 || visualViewport?.height !== initialViewportHeight) {\n visualViewport?.removeEventListener('resize', handleResize);\n visualViewport?.removeEventListener('scroll', handleResize);\n stateRef.current.resizeRAFHandle = null;\n recalcKeyboardOffsets();\n } else {\n stateRef.current.resizeRAFHandle = requestAnimationFrame(waitForResize);\n }\n };\n\n const handleBlur = () => {\n stateRef.current.hasFocus = false;\n if (stateRef.current.resizeRAFHandle !== null) {\n cancelAnimationFrame(stateRef.current.resizeRAFHandle);\n stateRef.current.resizeRAFHandle = null;\n }\n focusedElement.removeEventListener('blur', handleBlur);\n focusedElementRef.current = null;\n\n if (isSafari) {\n recalcKeyboardOffsets();\n }\n };\n\n stateRef.current.hasFocus = true;\n stateRef.current.resizeRAFHandle = requestAnimationFrame(waitForResize);\n visualViewport?.addEventListener('resize', handleResize);\n // событие scroll может прилететь, только если браузер сдвинул вьюпорт из-за появления виртуальной клавиатуры\n // пользовательский скролл не вызывает событие scroll, т.к. нативный скролл отключен\n // в Safari событие resize может прилететь до того как браузер сдвинул вьюпорт, поэтому слушаем scroll\n if (isSafari) {\n visualViewport?.addEventListener('scroll', handleResize);\n }\n focusedElement.addEventListener('blur', handleBlur);\n focusedElementRef.current = focusedElement;\n },\n [isSafari, recalcKeyboardOffsets]\n );\n\n // contentOverlay совпадает по границам с контентом боттомшита, но лежит вне боттомшита,\n // чтобы чайлды contentOverlay не обрезались границами боттомшита\n // например, снекбар, лежащий внутри contentOverlay, при смахивании может оказаться в любом месте экрана\n // поэтому позицию contentOverlay нужно синхронизировать\n const recalcContentOverlayPosition = useCallback(() => {\n if (\n contentOverlayRef.current !== null &&\n scrollContainerRef.current !== null &&\n visualContainerRef.current !== null\n ) {\n contentOverlayRef.current.style.top = `${LayoutMetrics.current.contentTop}px`;\n contentOverlayRef.current.style.height = `${LayoutMetrics.current.visibleContentHeight}px`;\n }\n }, []);\n\n // помещает боттомшит в позицию вне экрана снизу, которая может быть начальной либо конечной точкой анимации\n const setTransformToInvisible = useCallback(() => {\n LayoutMetrics.current.invalidateCache();\n\n if (overlayRef.current !== null) {\n overlayRef.current.style.opacity = `0`;\n }\n if (swipeContainerRef.current !== null) {\n swipeContainerRef.current.style.transform = translateY(LayoutMetrics.current.bottomSheetHeight);\n }\n\n requestAnimationFrame(recalcContentOverlayPosition);\n requestAnimationFrame(recalcScrollFlags);\n }, [recalcContentOverlayPosition, recalcScrollFlags]);\n\n // помещает боттомшит в дефолтную позицию на экране, которая может быть начальной либо конечной точкой анимации\n const setTransformToVisible = useCallback(() => {\n LayoutMetrics.current.invalidateCache();\n\n stateRef.current.scrollOffset = LayoutMetrics.current.initialOffset;\n\n if (overlayRef.current !== null) {\n overlayRef.current.style.opacity = `1`;\n }\n if (swipeContainerRef.current !== null) {\n swipeContainerRef.current.style.transform = translateY(\n LayoutMetrics.current.initialOffset + stateRef.current.swipeOffset\n );\n }\n if (footerRef.current !== null) {\n footerRef.current.style.transform = translateY(-LayoutMetrics.current.initialOffset);\n }\n\n requestAnimationFrame(recalcContentOverlayPosition);\n requestAnimationFrame(recalcScrollFlags);\n }, [recalcContentOverlayPosition, recalcScrollFlags]);\n\n const handleExitAnimationStart = useCallback(() => {\n setTransformToVisible();\n onBeforeExit?.();\n }, [setTransformToVisible, onBeforeExit]);\n\n const handleExitAnimationEnd = useCallback(() => {\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET, `0px`);\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET, `0px`);\n\n stateRef.current.resizeRAFHandle !== null && cancelAnimationFrame(stateRef.current.resizeRAFHandle);\n stateRef.current = makeInitialState();\n\n stateRef.current.exitHandlers.forEach((handler) => handler());\n stateRef.current.exitHandlers = [];\n onAfterExit?.();\n }, [onAfterExit]);\n\n const handleHeightAnimationStart = useCallback(() => {\n LayoutMetrics.current.invalidateCache();\n\n if (stateRef.current.heightAnimationDiff !== null && visualContainerRef.current !== null) {\n visualContainerRef.current.style.height = `${\n LayoutMetrics.current.bottomSheetHeight + stateRef.current.heightAnimationDiff\n }px`;\n }\n }, []);\n\n const handleHeightAnimationEnd = useCallback(() => {\n LayoutMetrics.current.invalidateCache();\n\n if (visualContainerRef.current !== null) {\n visualContainerRef.current.style.height = `${LayoutMetrics.current.bottomSheetHeight}px`;\n }\n\n stateRef.current.heightAnimationDiff = null;\n stateRef.current.heightAnimationCallback && requestAnimationFrame(stateRef.current.heightAnimationCallback);\n stateRef.current.heightAnimationCallback = null;\n setHeightAnimationRunning(false);\n\n requestAnimationFrame(recalcContentOverlayPosition);\n requestAnimationFrame(recalcScrollFlags);\n scrollContextProviderRef.current?.notify({\n scrollTop: 0,\n maxScrollTop: LayoutMetrics.current.maxScrollTop,\n });\n }, [setHeightAnimationRunning, recalcContentOverlayPosition, recalcScrollFlags]);\n\n const handleSwipeMove: SwipeEventHandler = useCallback(\n (event) => {\n if (\n (stateRef.current.touchAction !== null && stateRef.current.touchAction !== 'swipe') ||\n hasSelectedText()\n ) {\n return;\n }\n\n // храним неокругленное значение для translateY, чтобы анимация была плавнее\n let newSwipeOffset = stateRef.current.swipeOffset + event.deltaY;\n if (Math.round(newSwipeOffset) <= 0) {\n // боттомшит уперся в верхний край экрана, не даем свайпать дальше\n newSwipeOffset = 0;\n if (stateRef.current.touchAction === 'swipe') {\n stateRef.current.touchAction = 'complete';\n }\n } else {\n // свайп в процессе\n stateRef.current.touchAction = 'swipe';\n }\n\n if (stateRef.current.swipeOffset !== newSwipeOffset) {\n stateRef.current.swipeOffset = newSwipeOffset;\n\n if (swipeContainerRef.current !== null) {\n swipeContainerRef.current.style.transform = translateY(\n Math.max(stateRef.current.scrollOffset, 0) + newSwipeOffset\n );\n }\n\n recalcScrollFlags();\n }\n },\n [recalcScrollFlags]\n );\n\n const handleSwipeCancel: SwipeEventHandler = useCallback(() => {\n if (stateRef.current.touchAction === 'swipe') {\n stateRef.current.swipeOffset = 0;\n stateRef.current.touchAction = null;\n\n if (swipeContainerRef.current !== null) {\n swipeContainerRef.current.classList.add(styles.swipeCancelAnimation);\n const swipeContainer = swipeContainerRef.current;\n setTimeout(() => swipeContainer.classList.remove(styles.swipeCancelAnimation), 100);\n swipeContainerRef.current.style.transform = translateY(Math.max(stateRef.current.scrollOffset, 0));\n }\n\n recalcScrollFlags();\n }\n }, [recalcScrollFlags]);\n\n const handleSwipeEnd: SwipeEventHandler = useCallback(() => {\n if (stateRef.current.touchAction === 'swipe') {\n onCloseRef.current();\n }\n }, []);\n\n const swipeHandlers = useSwipeHandlers({\n thresholdYRef: SWIPE_THRESHOLD,\n onSwipeMove: handleSwipeMove,\n onSwipeEnd: handleSwipeEnd,\n onSwipeCancel: handleSwipeCancel,\n });\n\n const initTransformHandlers = useCallback(() => {\n const visualContainer = visualContainerRef.current;\n if (!visualContainer) {\n return void 0;\n }\n\n const handleScroll = (delta: number) => {\n if (\n LayoutMetrics.current.initialOffset !== 0 ||\n LayoutMetrics.current.contentHeight > LayoutMetrics.current.visibleContentHeight\n ) {\n // храним неокругленное значение для translateY, чтобы анимация была плавнее\n let newScrollOffset = stateRef.current.scrollOffset + delta;\n const roundedNewScrollOffset = Math.round(newScrollOffset);\n\n if (roundedNewScrollOffset >= LayoutMetrics.current.initialOffset) {\n // скролла нет (touchAction is null)\n // либо контент проскроллен в начало, тогда не даем скроллить дальше\n newScrollOffset = LayoutMetrics.current.initialOffset;\n if (stateRef.current.touchAction === 'scroll') {\n stateRef.current.touchAction = 'complete';\n }\n } else if (\n LayoutMetrics.current.contentHeight + roundedNewScrollOffset <=\n LayoutMetrics.current.visibleContentHeight\n ) {\n // скролла нет (touchAction is null)\n // либо контент проскроллен до конца, тогда не даем скроллить дальше\n newScrollOffset = LayoutMetrics.current.visibleContentHeight - LayoutMetrics.current.contentHeight;\n if (stateRef.current.touchAction === 'scroll') {\n stateRef.current.touchAction = 'complete';\n }\n } else {\n // скролл в процессе\n stateRef.current.touchAction = 'scroll';\n }\n\n if (stateRef.current.scrollOffset !== newScrollOffset) {\n const offsetWasPositive = stateRef.current.scrollOffset > 0;\n stateRef.current.scrollOffset = newScrollOffset;\n\n if (contentRef.current !== null && swipeContainerRef.current !== null) {\n if (newScrollOffset > 0) {\n if (!offsetWasPositive) {\n contentRef.current.style.transform = translateY(0);\n }\n swipeContainerRef.current.style.transform = translateY(newScrollOffset);\n if (footerRef.current !== null) {\n footerRef.current.style.transform = translateY(-newScrollOffset);\n }\n } else {\n contentRef.current.style.transform = translateY(newScrollOffset);\n if (offsetWasPositive) {\n swipeContainerRef.current.style.transform = translateY(0);\n if (footerRef.current !== null) {\n footerRef.current.style.transform = translateY(0);\n }\n }\n }\n }\n\n recalcScrollFlags();\n scrollContextProviderRef.current?.notify({\n scrollTop: Math.max(-stateRef.current.scrollOffset, 0),\n maxScrollTop: LayoutMetrics.current.maxScrollTop,\n });\n }\n }\n };\n\n let focusedElementTouchY: number | null = null;\n\n const onTouchMove = (event: ScrollGestureEvent) => {\n if (\n (!allowScrollWhileFocused && stateRef.current.hasFocus) ||\n (stateRef.current.touchAction !== null && stateRef.current.touchAction !== 'scroll') ||\n hasSelectedText() ||\n (focusedElementRef.current !== null &&\n focusedElementTouchY !== null &&\n focusedElementRef.current.clientHeight !== focusedElementRef.current.scrollHeight)\n ) {\n return;\n }\n handleScroll(event.delta);\n };\n\n const onTouchEnd = () => {\n if (focusedElementTouchY !== null) {\n focusedElementTouchY = null;\n }\n if (stateRef.current.touchAction === 'scroll') {\n stateRef.current.touchAction = null;\n }\n };\n\n const handleTouchStart = (event: TouchEvent) => {\n if (stateRef.current.touchAction === 'complete') {\n stateRef.current.touchAction = null;\n }\n if (event.target === focusedElementRef.current && focusedElementRef.current !== null) {\n focusedElementTouchY = event.changedTouches[0].pageY;\n } else {\n focusedElementTouchY = null;\n swipeHandlers.onTouchStart(event);\n }\n visualContainer.classList.add(styles.noCaret);\n };\n\n const handleTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n if (focusedElementRef.current !== null && focusedElementTouchY !== null) {\n focusedElementRef.current.scrollTop += focusedElementTouchY - event.changedTouches[0].pageY;\n focusedElementTouchY = event.changedTouches[0].pageY;\n } else {\n swipeHandlers.onTouchMove(event);\n }\n };\n\n const handleTouchEnd = (event: TouchEvent) => {\n swipeHandlers.onTouchEnd(event);\n visualContainer.classList.remove(styles.noCaret);\n };\n\n const handleTouchCancel = (event: TouchEvent) => {\n swipeHandlers.onTouchCancel(event);\n visualContainer.classList.remove(styles.noCaret);\n };\n\n const removeScrollHandlers = initScrollHandlers({\n axis: 'vertical',\n wrapperRef: visualContainerRef,\n onTouchMove,\n onTouchEnd,\n });\n visualContainer.addEventListener('touchstart', handleTouchStart);\n visualContainer.addEventListener('touchmove', handleTouchMove);\n visualContainer.addEventListener('touchend', handleTouchEnd);\n visualContainer.addEventListener('touchcancel', handleTouchCancel);\n\n return () => {\n removeScrollHandlers();\n visualContainer.removeEventListener('touchstart', handleTouchStart);\n visualContainer.removeEventListener('touchmove', handleTouchMove);\n visualContainer.removeEventListener('touchend', handleTouchEnd);\n visualContainer.removeEventListener('touchcancel', handleTouchCancel);\n };\n }, [allowScrollWhileFocused, recalcScrollFlags, swipeHandlers]);\n\n // при изменении высоты контента анимируем ее\n // задаем боттомшиту фиксированную высоту и пересчитываем ее самостоятельно,\n // чтобы не было мерцания, когда новый контент отрисовался до срабатывания колбека ResizeObserver\n const initHeightObserver = useCallback(() => {\n const visualContainer = visualContainerRef.current;\n if (!visualContainer) {\n return void 0;\n }\n\n let prevContentHeight = 0;\n let prevHeaderHeight = 0;\n let prevFooterHeight = 0;\n let prevVisibleContentHeight = 0;\n let skipFirstResizeCallback = true;\n let collapseResizeCallbacks = false;\n\n const handleHeightChange = () => {\n LayoutMetrics.current.invalidateCache();\n\n if (skipFirstResizeCallback) {\n visualContainer.style.height = `${LayoutMetrics.current.bottomSheetHeight}px`;\n prevHeaderHeight = LayoutMetrics.current.headerHeight;\n prevContentHeight = LayoutMetrics.current.contentHeight;\n prevFooterHeight = LayoutMetrics.current.footerHeight;\n prevVisibleContentHeight = LayoutMetrics.current.visibleContentHeight;\n\n skipFirstResizeCallback = false;\n return;\n }\n\n if (stateRef.current.heightAnimationDiff !== null) {\n if (!collapseResizeCallbacks) {\n // если предыдущая анимация не завершилась, без анимации сбрасываем высоту на вычисленную браузером\n visualContainer.style.height = ``;\n }\n } else {\n const contentHeightDiff = LayoutMetrics.current.contentHeight - prevContentHeight;\n const containersHeightDiff =\n LayoutMetrics.current.headerHeight -\n prevHeaderHeight +\n LayoutMetrics.current.footerHeight -\n prevFooterHeight;\n\n // предположим, что scrollContainer останется таким же или станет меньше\n // тогда можем рассчитать минимальную видимую высоту контента как min(scrollContainer.height, contentHeight)\n const _prevVisibleContentHeight = Math.min(prevVisibleContentHeight, prevContentHeight);\n const newMinVisibleContentHeight = Math.min(\n prevVisibleContentHeight - containersHeightDiff,\n LayoutMetrics.current.contentHeight\n );\n const minVisibleContentHeightDiff = newMinVisibleContentHeight - _prevVisibleContentHeight;\n\n // предположим, что scrollContainer станет больше\n // тогда контент не может увеличиться больше, чем на расстояние между боттомшитом и верхним краем экрана\n const maxVisibleContentHeightDiff =\n LayoutMetrics.current.remainingAvailableHeight - containersHeightDiff;\n\n const visibleContentHeightDiff = Math.min(\n Math.max(contentHeightDiff, minVisibleContentHeightDiff),\n maxVisibleContentHeightDiff\n );\n if (visibleContentHeightDiff !== 0) {\n resetScrollPosition();\n } else {\n // если высота видимой части контента не изменилась,\n // но позиция скролла превысила максимально допустимую из-за уменьшения высоты контента,\n // сбрасываем позицию скролла на максимально допустимую\n fixOverscroll();\n }\n\n const heightAnimationDiff = visibleContentHeightDiff + containersHeightDiff;\n if (heightAnimationDiff !== 0) {\n // запоминаем высоту scrollContainer после того, как боттомшиту будет присвоена новая высота.\n // до этого значение некорректно, т.к. новый контент уже был отрендерен,\n // но в инлайн-стилях боттомшита остается старая высота\n stateRef.current.heightAnimationDiff = heightAnimationDiff;\n stateRef.current.heightAnimationCallback = () => {\n prevVisibleContentHeight = LayoutMetrics.current.visibleContentHeight;\n };\n\n setHeightAnimationRunning(true);\n\n collapseResizeCallbacks = true;\n requestAnimationFrame(() => {\n collapseResizeCallbacks = false;\n });\n } else {\n recalcContentOverlayPosition();\n recalcScrollFlags();\n }\n }\n\n prevHeaderHeight = LayoutMetrics.current.headerHeight;\n prevContentHeight = LayoutMetrics.current.contentHeight;\n prevFooterHeight = LayoutMetrics.current.footerHeight;\n };\n\n const resizeObserver = new ResizeObserver(handleHeightChange);\n const content = contentRef.current;\n const footer = footerRef.current;\n const header = headerRef.current;\n\n content !== null && resizeObserver.observe(content);\n footer !== null && resizeObserver.observe(footer);\n header !== null && header.addHeightObserver(handleHeightChange);\n\n return () => {\n resizeObserver.disconnect();\n header !== null && header.removeHeightObserver(handleHeightChange);\n };\n }, [\n fixOverscroll,\n recalcContentOverlayPosition,\n recalcScrollFlags,\n resetScrollPosition,\n setHeightAnimationRunning,\n ]);\n\n const handleAppearAnimationEnd = useCallback(() => {\n const removeHeightObserver = initHeightObserver();\n removeHeightObserver && stateRef.current.exitHandlers.push(removeHeightObserver);\n\n const removeTransformHandlers = hasTouchSupport && initTransformHandlers();\n removeTransformHandlers && stateRef.current.exitHandlers.push(removeTransformHandlers);\n\n onAppearRef.current?.();\n }, [hasTouchSupport, initHeightObserver, initTransformHandlers]);\n\n const { onTouchEnd, ...eventHandlers } = useNoBubbling();\n\n if (!animationTimeout) {\n return null;\n }\n\n const renderFunc = (appearTransition: TransitionStatus, heightTransition: TransitionStatus) => {\n const navigationBar =\n header && isNavigationBarComponent(header) ? (\n <NavigationBarComponent {...header.props} forwardedRef={headerRef} />\n ) : null;\n\n const content = (\n <div\n className={classnames(styles.content, {\n [styles.contentFullScreen]: height === 'full-screen',\n [styles.contentWithPaddings]: withContentPaddings,\n [styles.contentWithoutHeader]: !header,\n [styles.contentSizedFullScreen]: isContentSizedFullHeight,\n })}\n ref={contentRef}\n >\n <BottomSheetContext.Provider value={bottomSheetContext}>{children}</BottomSheetContext.Provider>\n </div>\n );\n\n const scrollContainer = hasTouchSupport ? (\n <CustomScrollContextProvider ref={scrollContextProviderRef}>\n <div className={styles.scrollContainer} onFocus={handleFocus} ref={scrollContainerRef}>\n {navigationBar}\n {content}\n </div>\n </CustomScrollContextProvider>\n ) : (\n <div\n className={classnames(styles.scrollContainer, styles.nativeScrollContainer)}\n onFocus={handleFocus}\n onScroll={recalcScrollFlags}\n ref={scrollContainerRef}\n >\n {navigationBar}\n {content}\n </div>\n );\n\n const clonedFooter =\n footer && isActionBarComponent(footer)\n ? cloneElement(footer, { type: footer.props.type || 'mobile', showDivider: false })\n : footer;\n\n return (\n <Layer layer=\"bottom-sheet\">\n <div {...eventHandlers} className={styles.overlay}>\n <div\n className={classnames(styles.overlayBackground, {\n [styles.overlayBackgroundVisible]: showOverlay,\n [styles.appearAnimation]: appearTransition === 'entering',\n [styles.disappearAnimation]: appearTransition === 'exiting',\n })}\n {...(appearTransition === 'entered'\n ? { 'data-qa': 'bottom-sheet-overlay', onClick: onCloseRef.current }\n : {})}\n ref={overlayRef}\n />\n <div\n className={classnames(styles.swipeContainer, {\n [styles.appearAnimation]: appearTransition === 'entering',\n [styles.closeBySwipeAnimation]:\n appearTransition === 'exiting' && stateRef.current.touchAction === 'swipe',\n [styles.disappearAnimation]: appearTransition === 'exiting',\n })}\n data-qa={appearTransition === 'entered' ? 'bottom-sheet-container' : undefined}\n ref={swipeContainerRef}\n >\n <div\n className={classnames(styles.grabber, styles.grabberTransitionAnimation, {\n [styles.grabberEnsureSafe]: stateRef.current.grabberUnsafe,\n })}\n ref={grabberRef}\n />\n <div\n className={classnames(styles.visualContainer, {\n [styles.visualContainerFullScreen]: height === 'full-screen',\n [styles.heightTransitionAnimation]: heightTransition === 'entering',\n })}\n data-qa={appearTransition === 'entered' ? 'bottom-sheet-content' : undefined}\n ref={bottomSheetRef}\n >\n {scrollContainer}\n <div className={styles.footer} ref={footerRef}>\n {footer && (\n <div\n className={classnames(styles.divider, {\n [styles.dividerVisible]: stateRef.current.dividerVisible,\n })}\n ref={dividerRef}\n >\n <Divider />\n </div>\n )}\n {interceptClickHandlers && hasTouchSupport ? (\n <ClickInterceptor>{clonedFooter}</ClickInterceptor>\n ) : (\n clonedFooter\n )}\n </div>\n </div>\n <div className={styles.contentOverlay} ref={contentOverlayRef} />\n </div>\n </div>\n </Layer>\n );\n };\n\n return createPortal(\n <div\n className={styles.cssVariablesContainer}\n data-qa=\"bottom-sheet-css-variables\"\n ref={cssVariablesContainerRef}\n >\n <Transition\n appear\n in={currentVisible}\n mountOnEnter\n onEnter={setTransformToInvisible}\n onEntering={setTransformToVisible}\n onEntered={handleAppearAnimationEnd}\n onExit={handleExitAnimationStart}\n onExiting={setTransformToInvisible}\n onExited={handleExitAnimationEnd}\n timeout={animationTimeout.appear}\n unmountOnExit\n nodeRef={contentRef}\n key={`hasTouchSupport:${hasTouchSupport}`}\n >\n {(appearTransition) => (\n <Transition\n in={heightAnimationRunning}\n onEnter={handleHeightAnimationStart}\n onEntered={handleHeightAnimationEnd}\n timeout={animationTimeout.height}\n nodeRef={contentRef}\n >\n {(heightTransition) => renderFunc(appearTransition, heightTransition)}\n </Transition>\n )}\n </Transition>\n </div>,\n document.body\n );\n};\n\nexport const BottomSheet = forwardRef(BottomSheetRenderFunc);\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import './index.css';
2
2
  import { jsx } from 'react/jsx-runtime';
3
- import { s as styles } from './bottom-sheet-vO1Ak6Kl.js';
3
+ import { s as styles } from './bottom-sheet-C4VJXwIv.js';
4
4
 
5
5
  const BottomSheetFooter = ({ children }) => (jsx("div", { className: styles.footerWithPadding, children: children }));
6
6
 
@@ -0,0 +1,5 @@
1
+ import './index.css';
2
+ var styles = {"flex-container":"magritte-flex-container___muHAx_7-0-0","flexContainer":"magritte-flex-container___muHAx_7-0-0","animation-timeout":"magritte-animation-timeout___yd-SZ_7-0-0","animationTimeout":"magritte-animation-timeout___yd-SZ_7-0-0","css-variables-container":"magritte-css-variables-container___jBCr9_7-0-0","cssVariablesContainer":"magritte-css-variables-container___jBCr9_7-0-0","appear-animation":"magritte-appear-animation___P84Ln_7-0-0","appearAnimation":"magritte-appear-animation___P84Ln_7-0-0","disappear-animation":"magritte-disappear-animation___Putks_7-0-0","disappearAnimation":"magritte-disappear-animation___Putks_7-0-0","grabber-transition-animation":"magritte-grabber-transition-animation___s3Oh4_7-0-0","grabberTransitionAnimation":"magritte-grabber-transition-animation___s3Oh4_7-0-0","height-transition-animation":"magritte-height-transition-animation___xNprr_7-0-0","heightTransitionAnimation":"magritte-height-transition-animation___xNprr_7-0-0","close-by-swipe-animation":"magritte-close-by-swipe-animation___wdezY_7-0-0","closeBySwipeAnimation":"magritte-close-by-swipe-animation___wdezY_7-0-0","swipe-cancel-animation":"magritte-swipe-cancel-animation___AhYj5_7-0-0","swipeCancelAnimation":"magritte-swipe-cancel-animation___AhYj5_7-0-0","overlay":"magritte-overlay___5a2U-_7-0-0","overlay-background":"magritte-overlay-background___8Sd4V_7-0-0","overlayBackground":"magritte-overlay-background___8Sd4V_7-0-0","overlay-background_visible":"magritte-overlay-background_visible___FOJgj_7-0-0","overlayBackgroundVisible":"magritte-overlay-background_visible___FOJgj_7-0-0","swipe-container":"magritte-swipe-container___sZ2n5_7-0-0","swipeContainer":"magritte-swipe-container___sZ2n5_7-0-0","grabber":"magritte-grabber___A7SB-_7-0-0","grabber_ensure-safe":"magritte-grabber_ensure-safe___DR-dV_7-0-0","grabberEnsureSafe":"magritte-grabber_ensure-safe___DR-dV_7-0-0","visual-container":"magritte-visual-container___-VSuY_7-0-0","visualContainer":"magritte-visual-container___-VSuY_7-0-0","visual-container_full-screen":"magritte-visual-container_full-screen___jCCBb_7-0-0","visualContainerFullScreen":"magritte-visual-container_full-screen___jCCBb_7-0-0","scroll-container":"magritte-scroll-container___4ngNY_7-0-0","scrollContainer":"magritte-scroll-container___4ngNY_7-0-0","native-scroll-container":"magritte-native-scroll-container___JOlxE_7-0-0","nativeScrollContainer":"magritte-native-scroll-container___JOlxE_7-0-0","content":"magritte-content___1gAwP_7-0-0","content_full-screen":"magritte-content_full-screen___2SFaO_7-0-0","contentFullScreen":"magritte-content_full-screen___2SFaO_7-0-0","content_sized-full-screen":"magritte-content_sized-full-screen___45pa6_7-0-0","contentSizedFullScreen":"magritte-content_sized-full-screen___45pa6_7-0-0","content_with-paddings":"magritte-content_with-paddings___gIiAv_7-0-0","contentWithPaddings":"magritte-content_with-paddings___gIiAv_7-0-0","footer":"magritte-footer___RWslT_7-0-0","footer-with-padding":"magritte-footer-with-padding___KwkhC_7-0-0","footerWithPadding":"magritte-footer-with-padding___KwkhC_7-0-0","divider":"magritte-divider___0F8hh_7-0-0","divider_visible":"magritte-divider_visible___pAWZM_7-0-0","dividerVisible":"magritte-divider_visible___pAWZM_7-0-0","content-overlay":"magritte-content-overlay___HAyzL_7-0-0","contentOverlay":"magritte-content-overlay___HAyzL_7-0-0","no-caret":"magritte-no-caret___ewcMD_7-0-0","noCaret":"magritte-no-caret___ewcMD_7-0-0"};
3
+
4
+ export { styles as s };
5
+ //# sourceMappingURL=bottom-sheet-C4VJXwIv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bottom-sheet-C4VJXwIv.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
package/index.css CHANGED
@@ -19,13 +19,13 @@
19
19
  --magritte-color-component-bottom-sheet-grabber-content-v21-2-0:#c6c6c68f;
20
20
  --magritte-color-component-_overlay-background-content-v21-2-0:#26262699;
21
21
  }
22
- .magritte-flex-container___muHAx_6-0-2{
22
+ .magritte-flex-container___muHAx_7-0-0{
23
23
  display:flex;
24
24
  flex-direction:column;
25
25
  align-items:stretch;
26
26
  }
27
- .magritte-animation-timeout___yd-SZ_6-0-2,
28
- .magritte-css-variables-container___jBCr9_6-0-2{
27
+ .magritte-animation-timeout___yd-SZ_7-0-0,
28
+ .magritte-css-variables-container___jBCr9_7-0-0{
29
29
  --virtual-keyboard-top-offset:0px;
30
30
  --virtual-keyboard-bottom-offset:0px;
31
31
  --enter-animation-duration:0ms;
@@ -35,8 +35,8 @@
35
35
  --swipe-cancel-transition-duration:0ms;
36
36
  }
37
37
  @media (prefers-reduced-motion: no-preference){
38
- .magritte-animation-timeout___yd-SZ_6-0-2,
39
- .magritte-css-variables-container___jBCr9_6-0-2{
38
+ .magritte-animation-timeout___yd-SZ_7-0-0,
39
+ .magritte-css-variables-container___jBCr9_7-0-0{
40
40
  --enter-animation-duration:var(--magritte-semantic-animation-ease-in-out-300-duration-v21-2-0);
41
41
  --exit-animation-duration:var(--magritte-semantic-animation-ease-in-out-200-duration-v21-2-0);
42
42
  --grabber-animation-duration:var(--magritte-semantic-animation-ease-in-out-200-duration-v21-2-0);
@@ -44,52 +44,52 @@
44
44
  --swipe-cancel-transition-duration:var(--magritte-semantic-animation-ease-in-out-100-duration-v21-2-0);
45
45
  }
46
46
  }
47
- .magritte-appear-animation___P84Ln_6-0-2{
47
+ .magritte-appear-animation___P84Ln_7-0-0{
48
48
  transition-property:transform opacity;
49
49
  transition-duration:var(--enter-animation-duration);
50
50
  transition-timing-function:var(--magritte-semantic-animation-ease-in-out-300-timing-function-v21-2-0);
51
51
  }
52
- .magritte-disappear-animation___Putks_6-0-2{
52
+ .magritte-disappear-animation___Putks_7-0-0{
53
53
  transition-property:transform opacity;
54
54
  transition-duration:var(--exit-animation-duration);
55
55
  transition-timing-function:var(--magritte-semantic-animation-ease-in-out-200-timing-function-v21-2-0);
56
56
  }
57
- .magritte-grabber-transition-animation___s3Oh4_6-0-2::after{
57
+ .magritte-grabber-transition-animation___s3Oh4_7-0-0::after{
58
58
  transition-property:transform;
59
59
  transition-duration:var(--grabber-animation-duration);
60
60
  transition-timing-function:var(--magritte-semantic-animation-ease-in-out-200-timing-function-v21-2-0);
61
61
  }
62
- .magritte-height-transition-animation___xNprr_6-0-2{
62
+ .magritte-height-transition-animation___xNprr_7-0-0{
63
63
  transition-property:height;
64
64
  transition-duration:var(--height-transition-duration);
65
65
  transition-timing-function:var(--magritte-semantic-animation-ease-in-out-400-timing-function-v21-2-0);
66
66
  }
67
- .magritte-close-by-swipe-animation___wdezY_6-0-2{
67
+ .magritte-close-by-swipe-animation___wdezY_7-0-0{
68
68
  transition-property:transform;
69
69
  transition-duration:var(--exit-animation-duration);
70
70
  transition-timing-function:linear;
71
71
  }
72
- .magritte-swipe-cancel-animation___AhYj5_6-0-2{
72
+ .magritte-swipe-cancel-animation___AhYj5_7-0-0{
73
73
  transition-property:transform;
74
74
  transition-duration:var(--swipe-cancel-transition-duration);
75
75
  transition-timing-function:var(--magritte-semantic-animation-ease-in-out-100-duration-v21-2-0);
76
76
  }
77
- .magritte-overlay___5a2U-_6-0-2{
77
+ .magritte-overlay___5a2U-_7-0-0{
78
78
  pointer-events:none;
79
79
  position:fixed;
80
80
  inset:0;
81
81
  }
82
- .magritte-overlay-background___8Sd4V_6-0-2{
82
+ .magritte-overlay-background___8Sd4V_7-0-0{
83
83
  position:absolute;
84
84
  inset:0;
85
85
  will-change:opacity;
86
86
  transform:translate3d(0, 0, 0);
87
87
  }
88
- .magritte-overlay-background_visible___FOJgj_6-0-2{
88
+ .magritte-overlay-background_visible___FOJgj_7-0-0{
89
89
  pointer-events:initial;
90
90
  background-color:var(--magritte-color-component-_overlay-background-content-v21-2-0);
91
91
  }
92
- .magritte-swipe-container___sZ2n5_6-0-2{
92
+ .magritte-swipe-container___sZ2n5_7-0-0{
93
93
  display:flex;
94
94
  flex-direction:column;
95
95
  align-items:stretch;
@@ -99,11 +99,11 @@
99
99
  will-change:transform;
100
100
  transform:translate3d(0, 0, 0);
101
101
  }
102
- .magritte-grabber___A7SB-_6-0-2{
102
+ .magritte-grabber___A7SB-_7-0-0{
103
103
  flex:0 0 20px;
104
104
  position:relative;
105
105
  }
106
- .magritte-grabber___A7SB-_6-0-2::after{
106
+ .magritte-grabber___A7SB-_7-0-0::after{
107
107
  content:'';
108
108
  position:absolute;
109
109
  top:8px;
@@ -114,10 +114,10 @@
114
114
  border-radius:var(--magritte-static-border-radius-50-v21-2-0);
115
115
  z-index:3;
116
116
  }
117
- .magritte-grabber_ensure-safe___DR-dV_6-0-2::after{
117
+ .magritte-grabber_ensure-safe___DR-dV_7-0-0::after{
118
118
  transform:translateY(20px);
119
119
  }
120
- .magritte-visual-container___-VSuY_6-0-2{
120
+ .magritte-visual-container___-VSuY_7-0-0{
121
121
  display:flex;
122
122
  flex-direction:column;
123
123
  align-items:stretch;
@@ -130,11 +130,11 @@
130
130
  overflow:clip;
131
131
  user-select:text;
132
132
  }
133
- .magritte-visual-container_full-screen___jCCBb_6-0-2{
133
+ .magritte-visual-container_full-screen___jCCBb_7-0-0{
134
134
  flex:1 1 auto;
135
135
  min-height:1px;
136
136
  }
137
- .magritte-scroll-container___4ngNY_6-0-2{
137
+ .magritte-scroll-container___4ngNY_7-0-0{
138
138
  --magritte-ui-navigation-bar-background-override:var(--magritte-color-component-bottom-sheet-background-content-v21-2-0);
139
139
  --magritte-ui-navigation-bar-top-padding-override:16px;
140
140
  display:flex;
@@ -144,14 +144,14 @@
144
144
  min-height:1px;
145
145
  z-index:1;
146
146
  }
147
- .magritte-native-scroll-container___JOlxE_6-0-2{
147
+ .magritte-native-scroll-container___JOlxE_7-0-0{
148
148
  overflow:scroll;
149
149
  scrollbar-width:none;
150
150
  }
151
- .magritte-native-scroll-container___JOlxE_6-0-2::-webkit-scrollbar{
151
+ .magritte-native-scroll-container___JOlxE_7-0-0::-webkit-scrollbar{
152
152
  display:none;
153
153
  }
154
- .magritte-content___1gAwP_6-0-2{
154
+ .magritte-content___1gAwP_7-0-0{
155
155
  display:flex;
156
156
  flex-direction:column;
157
157
  align-items:stretch;
@@ -160,37 +160,41 @@
160
160
  will-change:transform;
161
161
  transform:translate3d(0, 0, 0);
162
162
  }
163
- .magritte-content_full-screen___2SFaO_6-0-2{
163
+ .magritte-content_full-screen___2SFaO_7-0-0{
164
164
  flex:1 0 auto;
165
165
  }
166
- .magritte-content_sized-full-screen___45pa6_6-0-2{
166
+ .magritte-content_sized-full-screen___45pa6_7-0-0{
167
167
  flex:1 1 auto;
168
168
  min-height:1px;
169
169
  }
170
- .magritte-content_with-paddings___gIiAv_6-0-2{
170
+ .magritte-content_with-paddings___gIiAv_7-0-0{
171
171
  padding:16px 16px 0;
172
172
  }
173
- .magritte-footer___RWslT_6-0-2{
173
+ .magritte-footer___RWslT_7-0-0{
174
174
  flex:0 0 auto;
175
175
  background-color:var(--magritte-color-component-bottom-sheet-background-content-v21-2-0);
176
176
  z-index:2;
177
177
  will-change:transform;
178
178
  transform:translate3d(0, 0, 0);
179
179
  }
180
- .magritte-footer-with-padding___KwkhC_6-0-2{
180
+ .magritte-footer-with-padding___KwkhC_7-0-0{
181
181
  display:flex;
182
182
  flex-direction:column;
183
183
  gap:12px;
184
184
  padding:16px;
185
185
  }
186
- .magritte-divider___0F8hh_6-0-2{
186
+ .magritte-divider___0F8hh_7-0-0{
187
187
  visibility:hidden;
188
188
  }
189
- .magritte-divider_visible___pAWZM_6-0-2{
189
+ .magritte-divider_visible___pAWZM_7-0-0{
190
190
  visibility:visible;
191
191
  }
192
- .magritte-content-overlay___HAyzL_6-0-2{
192
+ .magritte-content-overlay___HAyzL_7-0-0{
193
193
  pointer-events:none;
194
194
  position:absolute;
195
195
  inset:0;
196
196
  }
197
+ .magritte-no-caret___ewcMD_7-0-0{
198
+ --magritte-ui-input-caret-color-override:transparent;
199
+ --magritte-ui-textarea-caret-color-override:transparent;
200
+ }
package/index.js CHANGED
@@ -22,5 +22,5 @@ import '@hh.ru/magritte-ui-divider';
22
22
  import '@hh.ru/magritte-ui-layer';
23
23
  import '@hh.ru/magritte-ui-navigation-bar';
24
24
  import '@hh.ru/magritte-ui-tree-selector';
25
- import './bottom-sheet-vO1Ak6Kl.js';
25
+ import './bottom-sheet-C4VJXwIv.js';
26
26
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hh.ru/magritte-ui-bottom-sheet",
3
- "version": "6.0.2",
3
+ "version": "7.0.0",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "sideEffects": [
@@ -29,14 +29,14 @@
29
29
  "@hh.ru/magritte-design-tokens": "21.2.0",
30
30
  "@hh.ru/magritte-internal-custom-scroll": "1.3.3",
31
31
  "@hh.ru/magritte-internal-layer-name": "3.0.0",
32
- "@hh.ru/magritte-ui-action-bar": "3.0.2",
32
+ "@hh.ru/magritte-ui-action-bar": "3.0.3",
33
33
  "@hh.ru/magritte-ui-breakpoint": "5.0.0",
34
34
  "@hh.ru/magritte-ui-divider": "1.1.42",
35
35
  "@hh.ru/magritte-ui-layer": "3.0.0",
36
36
  "@hh.ru/magritte-ui-mock-component": "1.0.12",
37
- "@hh.ru/magritte-ui-navigation-bar": "7.0.1",
37
+ "@hh.ru/magritte-ui-navigation-bar": "7.0.2",
38
38
  "@hh.ru/magritte-ui-theme-provider": "1.1.38",
39
- "@hh.ru/magritte-ui-tree-selector": "4.6.19"
39
+ "@hh.ru/magritte-ui-tree-selector": "4.6.20"
40
40
  },
41
41
  "peerDependencies": {
42
42
  "classnames": ">=2.3.2",
@@ -47,5 +47,5 @@
47
47
  "publishConfig": {
48
48
  "access": "public"
49
49
  },
50
- "gitHead": "4cea99b0c3be38206bb6f5e6945fa298c8b3dcd1"
50
+ "gitHead": "199227110bed4857511f22c1154eff84ad8040ab"
51
51
  }
package/types.d.ts CHANGED
@@ -26,7 +26,7 @@ export interface BottomSheetProps {
26
26
  */
27
27
  interceptClickHandlers?: boolean;
28
28
  /** Должна ли виртуальная клавиатура перекрывать Bottom Sheet (по умолчанию) или сдвигать */
29
- keyboardOverlaysContent?: boolean;
29
+ keyboardOverlaysFooter?: boolean;
30
30
  /** Флаг, показывать ли компонент */
31
31
  visible: boolean;
32
32
  /** Колбек, который будет вызван после завершения анимации открытия */
@@ -1,5 +0,0 @@
1
- import './index.css';
2
- var styles = {"flex-container":"magritte-flex-container___muHAx_6-0-2","flexContainer":"magritte-flex-container___muHAx_6-0-2","animation-timeout":"magritte-animation-timeout___yd-SZ_6-0-2","animationTimeout":"magritte-animation-timeout___yd-SZ_6-0-2","css-variables-container":"magritte-css-variables-container___jBCr9_6-0-2","cssVariablesContainer":"magritte-css-variables-container___jBCr9_6-0-2","appear-animation":"magritte-appear-animation___P84Ln_6-0-2","appearAnimation":"magritte-appear-animation___P84Ln_6-0-2","disappear-animation":"magritte-disappear-animation___Putks_6-0-2","disappearAnimation":"magritte-disappear-animation___Putks_6-0-2","grabber-transition-animation":"magritte-grabber-transition-animation___s3Oh4_6-0-2","grabberTransitionAnimation":"magritte-grabber-transition-animation___s3Oh4_6-0-2","height-transition-animation":"magritte-height-transition-animation___xNprr_6-0-2","heightTransitionAnimation":"magritte-height-transition-animation___xNprr_6-0-2","close-by-swipe-animation":"magritte-close-by-swipe-animation___wdezY_6-0-2","closeBySwipeAnimation":"magritte-close-by-swipe-animation___wdezY_6-0-2","swipe-cancel-animation":"magritte-swipe-cancel-animation___AhYj5_6-0-2","swipeCancelAnimation":"magritte-swipe-cancel-animation___AhYj5_6-0-2","overlay":"magritte-overlay___5a2U-_6-0-2","overlay-background":"magritte-overlay-background___8Sd4V_6-0-2","overlayBackground":"magritte-overlay-background___8Sd4V_6-0-2","overlay-background_visible":"magritte-overlay-background_visible___FOJgj_6-0-2","overlayBackgroundVisible":"magritte-overlay-background_visible___FOJgj_6-0-2","swipe-container":"magritte-swipe-container___sZ2n5_6-0-2","swipeContainer":"magritte-swipe-container___sZ2n5_6-0-2","grabber":"magritte-grabber___A7SB-_6-0-2","grabber_ensure-safe":"magritte-grabber_ensure-safe___DR-dV_6-0-2","grabberEnsureSafe":"magritte-grabber_ensure-safe___DR-dV_6-0-2","visual-container":"magritte-visual-container___-VSuY_6-0-2","visualContainer":"magritte-visual-container___-VSuY_6-0-2","visual-container_full-screen":"magritte-visual-container_full-screen___jCCBb_6-0-2","visualContainerFullScreen":"magritte-visual-container_full-screen___jCCBb_6-0-2","scroll-container":"magritte-scroll-container___4ngNY_6-0-2","scrollContainer":"magritte-scroll-container___4ngNY_6-0-2","native-scroll-container":"magritte-native-scroll-container___JOlxE_6-0-2","nativeScrollContainer":"magritte-native-scroll-container___JOlxE_6-0-2","content":"magritte-content___1gAwP_6-0-2","content_full-screen":"magritte-content_full-screen___2SFaO_6-0-2","contentFullScreen":"magritte-content_full-screen___2SFaO_6-0-2","content_sized-full-screen":"magritte-content_sized-full-screen___45pa6_6-0-2","contentSizedFullScreen":"magritte-content_sized-full-screen___45pa6_6-0-2","content_with-paddings":"magritte-content_with-paddings___gIiAv_6-0-2","contentWithPaddings":"magritte-content_with-paddings___gIiAv_6-0-2","footer":"magritte-footer___RWslT_6-0-2","footer-with-padding":"magritte-footer-with-padding___KwkhC_6-0-2","footerWithPadding":"magritte-footer-with-padding___KwkhC_6-0-2","divider":"magritte-divider___0F8hh_6-0-2","divider_visible":"magritte-divider_visible___pAWZM_6-0-2","dividerVisible":"magritte-divider_visible___pAWZM_6-0-2","content-overlay":"magritte-content-overlay___HAyzL_6-0-2","contentOverlay":"magritte-content-overlay___HAyzL_6-0-2"};
3
-
4
- export { styles as s };
5
- //# sourceMappingURL=bottom-sheet-vO1Ak6Kl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bottom-sheet-vO1Ak6Kl.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}