@hh.ru/magritte-ui-bottom-sheet 5.3.28 → 5.4.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 +129 -125
- package/BottomSheet.js.map +1 -1
- package/BottomSheetFooter.js +1 -1
- package/bottom-sheet-Ci2VSfuH.js +5 -0
- package/bottom-sheet-Ci2VSfuH.js.map +1 -0
- package/index.css +31 -39
- package/index.js +1 -1
- package/package.json +6 -6
- package/bottom-sheet-yGI7jsKt.js +0 -5
- package/bottom-sheet-yGI7jsKt.js.map +0 -1
package/BottomSheet.js
CHANGED
|
@@ -16,11 +16,10 @@ import { ClickInterceptor } from './ClickInterceptor.js';
|
|
|
16
16
|
import { useBreakpoint } from '@hh.ru/magritte-ui-breakpoint';
|
|
17
17
|
import { Divider } from '@hh.ru/magritte-ui-divider';
|
|
18
18
|
import { Layer } from '@hh.ru/magritte-ui-layer';
|
|
19
|
-
import {
|
|
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-
|
|
21
|
+
import { s as styles } from './bottom-sheet-Ci2VSfuH.js';
|
|
22
22
|
|
|
23
|
-
const NAVIGATION_BAR_CONTEXT_PROPS = { insideBottomSheet: true };
|
|
24
23
|
const CSS_VAR_ENTER_ANIMATION_DURATION = '--enter-animation-duration';
|
|
25
24
|
const CSS_VAR_EXIT_ANIMATION_DURATION = '--exit-animation-duration';
|
|
26
25
|
const CSS_VAR_HEIGHT_ANIMATION_DURATION = '--height-transition-duration';
|
|
@@ -78,75 +77,62 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
|
|
|
78
77
|
const stateRef = useRef({ ...INITIAL_STATE });
|
|
79
78
|
const [animationTimeout, setAnimationTimeout] = useState(null);
|
|
80
79
|
const [heightAnimationRunning, setHeightAnimationRunning] = useState(false);
|
|
81
|
-
const
|
|
80
|
+
const bottomSheetContext = useMemo(() => ({ contentOverlayRef }), [contentOverlayRef]);
|
|
82
81
|
const isSafari = useRef(isSafariFunc()).current;
|
|
83
82
|
const scrollContextProviderRef = useRef(null);
|
|
84
83
|
const exitHandlersRef = useRef([]);
|
|
85
84
|
const isContentSizedFullHeight = isValidTreeSelectorWrapper(children);
|
|
86
85
|
const LayoutMetrics = useRef((() => {
|
|
87
|
-
let
|
|
88
|
-
let cachedContentHeight = null;
|
|
89
|
-
let cachedFooterHeight = null;
|
|
90
|
-
let cachedHeaderHeight = null;
|
|
91
|
-
let cachedInitialOffset = null;
|
|
92
|
-
let cachedRemainingAvailableHeight = null;
|
|
93
|
-
let cachedScrollContainerHeight = null;
|
|
86
|
+
let cache = {};
|
|
94
87
|
return {
|
|
88
|
+
get availableScrollHeight() {
|
|
89
|
+
if (!('availableScrollHeight' in cache) && scrollContainerRef.current !== null) {
|
|
90
|
+
cache.availableScrollHeight =
|
|
91
|
+
scrollContainerRef.current.clientHeight - LayoutMetrics.current.headerHeight;
|
|
92
|
+
}
|
|
93
|
+
return cache.availableScrollHeight ?? 0;
|
|
94
|
+
},
|
|
95
95
|
get bottomSheetHeight() {
|
|
96
|
-
if (
|
|
97
|
-
|
|
96
|
+
if (!('bottomSheetHeight' in cache) && visualContainerRef.current !== null) {
|
|
97
|
+
cache.bottomSheetHeight = visualContainerRef.current.clientHeight;
|
|
98
98
|
}
|
|
99
|
-
return
|
|
99
|
+
return cache.bottomSheetHeight ?? 0;
|
|
100
100
|
},
|
|
101
101
|
get contentHeight() {
|
|
102
|
-
if (
|
|
103
|
-
|
|
102
|
+
if (!('contentHeight' in cache) && contentRef.current !== null) {
|
|
103
|
+
cache.contentHeight = contentRef.current.clientHeight;
|
|
104
104
|
}
|
|
105
|
-
return
|
|
105
|
+
return cache.contentHeight ?? 0;
|
|
106
106
|
},
|
|
107
107
|
get footerHeight() {
|
|
108
|
-
if (
|
|
109
|
-
|
|
108
|
+
if (!('footerHeight' in cache) && footerRef.current !== null) {
|
|
109
|
+
cache.footerHeight = footerRef.current.clientHeight;
|
|
110
110
|
}
|
|
111
|
-
return
|
|
111
|
+
return cache.footerHeight ?? 0;
|
|
112
112
|
},
|
|
113
113
|
get headerHeight() {
|
|
114
|
-
if (
|
|
115
|
-
|
|
114
|
+
if (!('headerHeight' in cache) && headerRef.current !== null) {
|
|
115
|
+
cache.headerHeight = headerRef.current.layoutHeight;
|
|
116
116
|
}
|
|
117
|
-
return
|
|
117
|
+
return cache.headerHeight ?? 0;
|
|
118
118
|
},
|
|
119
119
|
get initialOffset() {
|
|
120
|
-
if (
|
|
121
|
-
|
|
122
|
-
visualViewport !== null) {
|
|
123
|
-
cachedInitialOffset =
|
|
120
|
+
if (!('initialOffset' in cache) && visualContainerRef.current !== null && visualViewport !== null) {
|
|
121
|
+
cache.initialOffset =
|
|
124
122
|
height === 'half-screen'
|
|
125
123
|
? Math.max(Math.round(visualContainerRef.current.clientHeight - visualViewport.height / 2), 0)
|
|
126
124
|
: 0;
|
|
127
125
|
}
|
|
128
|
-
return
|
|
126
|
+
return cache.initialOffset ?? 0;
|
|
129
127
|
},
|
|
130
128
|
get remainingAvailableHeight() {
|
|
131
|
-
if (
|
|
132
|
-
|
|
133
|
-
}
|
|
134
|
-
return cachedRemainingAvailableHeight ?? 0;
|
|
135
|
-
},
|
|
136
|
-
get scrollContainerHeight() {
|
|
137
|
-
if (cachedScrollContainerHeight === null && scrollContainerRef.current !== null) {
|
|
138
|
-
cachedScrollContainerHeight = scrollContainerRef.current.clientHeight;
|
|
129
|
+
if (!('remainingAvailableHeight' in cache) && grabberRef.current !== null) {
|
|
130
|
+
cache.remainingAvailableHeight = grabberRef.current.offsetTop;
|
|
139
131
|
}
|
|
140
|
-
return
|
|
132
|
+
return cache.remainingAvailableHeight ?? 0;
|
|
141
133
|
},
|
|
142
134
|
invalidateCache() {
|
|
143
|
-
|
|
144
|
-
cachedContentHeight = null;
|
|
145
|
-
cachedFooterHeight = null;
|
|
146
|
-
cachedHeaderHeight = null;
|
|
147
|
-
cachedInitialOffset = null;
|
|
148
|
-
cachedRemainingAvailableHeight = null;
|
|
149
|
-
cachedScrollContainerHeight = null;
|
|
135
|
+
cache = {};
|
|
150
136
|
},
|
|
151
137
|
};
|
|
152
138
|
})());
|
|
@@ -177,73 +163,6 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
|
|
|
177
163
|
document.body.removeChild(animationTimeoutElement);
|
|
178
164
|
setAnimationTimeout({ appear: { enter, exit }, height: { enter: height, exit } });
|
|
179
165
|
}, [setAnimationTimeout]);
|
|
180
|
-
// при изменении высоты контента анимируем ее
|
|
181
|
-
// задаем боттомшиту фиксированную высоту и пересчитываем ее самостоятельно,
|
|
182
|
-
// чтобы не было мерцания, когда новый контент отрисовался до срабатывания колбека ResizeObserver
|
|
183
|
-
const initHeightObserver = useCallback(() => {
|
|
184
|
-
if (!contentRef.current || !footerRef.current || !headerRef.current || !visualContainerRef.current) {
|
|
185
|
-
return void 0;
|
|
186
|
-
}
|
|
187
|
-
const visualContainer = visualContainerRef.current;
|
|
188
|
-
let prevContentHeight = 0;
|
|
189
|
-
let prevHeaderHeight = 0;
|
|
190
|
-
let prevFooterHeight = 0;
|
|
191
|
-
let prevScrollContainerHeight = 0;
|
|
192
|
-
let skipFirst = true;
|
|
193
|
-
const observer = new ResizeObserver(() => {
|
|
194
|
-
LayoutMetrics.current.invalidateCache();
|
|
195
|
-
if (skipFirst) {
|
|
196
|
-
visualContainer.style.height = `${LayoutMetrics.current.bottomSheetHeight}px`;
|
|
197
|
-
prevHeaderHeight = LayoutMetrics.current.headerHeight;
|
|
198
|
-
prevContentHeight = LayoutMetrics.current.contentHeight;
|
|
199
|
-
prevFooterHeight = LayoutMetrics.current.footerHeight;
|
|
200
|
-
prevScrollContainerHeight = LayoutMetrics.current.scrollContainerHeight;
|
|
201
|
-
skipFirst = false;
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
if (stateRef.current.heightAnimationDiff !== null) {
|
|
205
|
-
// если предыдущая анимация не завершилась, без анимации сбрасываем высоту на вычисленную браузером
|
|
206
|
-
visualContainer.style.height = ``;
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
const contentHeightDiff = LayoutMetrics.current.contentHeight - prevContentHeight;
|
|
210
|
-
const containersHeightDiff = LayoutMetrics.current.headerHeight -
|
|
211
|
-
prevHeaderHeight +
|
|
212
|
-
LayoutMetrics.current.footerHeight -
|
|
213
|
-
prevFooterHeight;
|
|
214
|
-
// предположим, что scrollContainer останется таким же или станет меньше
|
|
215
|
-
// тогда можем рассчитать минимальную видимую высоту контента как min(scrollContainer.height, contentHeight)
|
|
216
|
-
const prevVisibleContentHeight = Math.min(prevScrollContainerHeight, prevContentHeight);
|
|
217
|
-
const newMinVisibleContentHeight = Math.min(prevScrollContainerHeight - containersHeightDiff, LayoutMetrics.current.contentHeight);
|
|
218
|
-
const minVisibleContentHeightDiff = newMinVisibleContentHeight - prevVisibleContentHeight;
|
|
219
|
-
// предположим, что scrollContainer станет больше
|
|
220
|
-
// тогда контент не может увеличиться больше, чем на расстояние между боттомшитом и верхним краем экрана
|
|
221
|
-
const maxVisibleContentHeightDiff = LayoutMetrics.current.remainingAvailableHeight - containersHeightDiff;
|
|
222
|
-
const visibleContentHeightDiff = Math.min(Math.max(contentHeightDiff, minVisibleContentHeightDiff), maxVisibleContentHeightDiff);
|
|
223
|
-
if (visibleContentHeightDiff !== 0) {
|
|
224
|
-
scrollContextProviderRef.current?.notify({ scrollTop: 0 });
|
|
225
|
-
}
|
|
226
|
-
const heightAnimationDiff = visibleContentHeightDiff + containersHeightDiff;
|
|
227
|
-
if (heightAnimationDiff !== 0) {
|
|
228
|
-
// запоминаем высоту scrollContainer после того, как боттомшиту будет присвоена новая высота.
|
|
229
|
-
// до этого значение некорректно, т.к. новый контент уже был отрендерен,
|
|
230
|
-
// но в инлайн-стилях боттомшита остается старая высота
|
|
231
|
-
stateRef.current.heightAnimationDiff = heightAnimationDiff;
|
|
232
|
-
stateRef.current.heightAnimationCallback = () => {
|
|
233
|
-
prevScrollContainerHeight = LayoutMetrics.current.scrollContainerHeight;
|
|
234
|
-
};
|
|
235
|
-
setHeightAnimationRunning(true);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
prevHeaderHeight = LayoutMetrics.current.headerHeight;
|
|
239
|
-
prevContentHeight = LayoutMetrics.current.contentHeight;
|
|
240
|
-
prevFooterHeight = LayoutMetrics.current.footerHeight;
|
|
241
|
-
});
|
|
242
|
-
observer.observe(headerRef.current);
|
|
243
|
-
observer.observe(contentRef.current);
|
|
244
|
-
observer.observe(footerRef.current);
|
|
245
|
-
return () => observer.disconnect();
|
|
246
|
-
}, [setHeightAnimationRunning]);
|
|
247
166
|
useEffect(() => {
|
|
248
167
|
if (!currentVisible || isSafari()) {
|
|
249
168
|
return;
|
|
@@ -302,8 +221,7 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
|
|
|
302
221
|
setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET, `${-layoutViewportDiff}px`);
|
|
303
222
|
// при этом может возникнуть проблема, что клавиатура перекрыла хедер
|
|
304
223
|
// проверяем это и компенсируем величину перекрытия при необходимости
|
|
305
|
-
const
|
|
306
|
-
const headerOutOfViewportHeight = Math.round(headerDOMRect.bottom + layoutViewportDiff - DOCUMENT_HEIGHT.current);
|
|
224
|
+
const headerOutOfViewportHeight = Math.round(headerRef.current.bottom + layoutViewportDiff - DOCUMENT_HEIGHT.current);
|
|
307
225
|
if (headerOutOfViewportHeight > 0) {
|
|
308
226
|
setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET, `${headerOutOfViewportHeight - layoutViewportDiff}px`);
|
|
309
227
|
}
|
|
@@ -379,15 +297,16 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
|
|
|
379
297
|
if (contentOverlayRef.current !== null &&
|
|
380
298
|
scrollContainerRef.current !== null &&
|
|
381
299
|
visualContainerRef.current !== null) {
|
|
382
|
-
|
|
383
|
-
contentOverlayRef.current.style.
|
|
300
|
+
const visibleHeaderHeight = headerRef.current?.visibleHeight ?? 0;
|
|
301
|
+
contentOverlayRef.current.style.top = `${scrollContainerRef.current.offsetTop + visualContainerRef.current.offsetTop + visibleHeaderHeight}px`;
|
|
302
|
+
contentOverlayRef.current.style.height = `${LayoutMetrics.current.availableScrollHeight}px`;
|
|
384
303
|
}
|
|
385
304
|
}, []);
|
|
386
305
|
const recalcScrollFlags = useCallback(() => {
|
|
387
306
|
if (dividerRef.current !== null) {
|
|
388
307
|
const prevDividerVisible = stateRef.current.dividerVisible;
|
|
389
308
|
const isNotScrolledToEnd = LayoutMetrics.current.contentHeight + stateRef.current.scrollOffset >
|
|
390
|
-
LayoutMetrics.current.
|
|
309
|
+
LayoutMetrics.current.availableScrollHeight;
|
|
391
310
|
stateRef.current.dividerVisible =
|
|
392
311
|
showDivider === 'always' || (showDivider === 'with-scroll' && isNotScrolledToEnd);
|
|
393
312
|
if (stateRef.current.dividerVisible !== prevDividerVisible) {
|
|
@@ -471,6 +390,7 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
|
|
|
471
390
|
setHeightAnimationRunning(false);
|
|
472
391
|
requestAnimationFrame(recalcContentOverlayPosition);
|
|
473
392
|
requestAnimationFrame(recalcScrollFlags);
|
|
393
|
+
scrollContextProviderRef.current?.notify({ scrollTop: 0 });
|
|
474
394
|
}, [setHeightAnimationRunning, recalcContentOverlayPosition, recalcScrollFlags]);
|
|
475
395
|
const handleSwipeMove = useCallback((event) => {
|
|
476
396
|
if ((stateRef.current.touchAction !== null && stateRef.current.touchAction !== 'swipe') ||
|
|
@@ -528,7 +448,7 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
|
|
|
528
448
|
}
|
|
529
449
|
const handleScroll = (delta) => {
|
|
530
450
|
if (LayoutMetrics.current.initialOffset !== 0 ||
|
|
531
|
-
LayoutMetrics.current.contentHeight > LayoutMetrics.current.
|
|
451
|
+
LayoutMetrics.current.contentHeight > LayoutMetrics.current.availableScrollHeight) {
|
|
532
452
|
// храним неокругленное значение для translateY, чтобы анимация была плавнее
|
|
533
453
|
let newScrollOffset = stateRef.current.scrollOffset + delta;
|
|
534
454
|
const roundedNewScrollOffset = Math.round(newScrollOffset);
|
|
@@ -541,10 +461,10 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
|
|
|
541
461
|
}
|
|
542
462
|
}
|
|
543
463
|
else if (LayoutMetrics.current.contentHeight + roundedNewScrollOffset <=
|
|
544
|
-
LayoutMetrics.current.
|
|
464
|
+
LayoutMetrics.current.availableScrollHeight) {
|
|
545
465
|
// скролла нет (touchAction is null)
|
|
546
466
|
// либо контент проскроллен до конца, тогда не даем скроллить дальше
|
|
547
|
-
newScrollOffset = LayoutMetrics.current.
|
|
467
|
+
newScrollOffset = LayoutMetrics.current.availableScrollHeight - LayoutMetrics.current.contentHeight;
|
|
548
468
|
if (stateRef.current.touchAction === 'scroll') {
|
|
549
469
|
stateRef.current.touchAction = 'complete';
|
|
550
470
|
}
|
|
@@ -633,6 +553,91 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
|
|
|
633
553
|
visualContainer.removeEventListener('touchcancel', swipeHandlers.onTouchCancel);
|
|
634
554
|
};
|
|
635
555
|
}, [allowScrollWhileFocused, recalcScrollFlags, swipeHandlers]);
|
|
556
|
+
// при изменении высоты контента анимируем ее
|
|
557
|
+
// задаем боттомшиту фиксированную высоту и пересчитываем ее самостоятельно,
|
|
558
|
+
// чтобы не было мерцания, когда новый контент отрисовался до срабатывания колбека ResizeObserver
|
|
559
|
+
const initHeightObserver = useCallback(() => {
|
|
560
|
+
const visualContainer = visualContainerRef.current;
|
|
561
|
+
if (!visualContainer) {
|
|
562
|
+
return void 0;
|
|
563
|
+
}
|
|
564
|
+
let prevContentHeight = 0;
|
|
565
|
+
let prevHeaderHeight = 0;
|
|
566
|
+
let prevFooterHeight = 0;
|
|
567
|
+
let prevAvailableScrollHeight = 0;
|
|
568
|
+
let skipFirstResizeCallback = true;
|
|
569
|
+
let collapseResizeCallbacks = false;
|
|
570
|
+
const handleHeightChange = () => {
|
|
571
|
+
LayoutMetrics.current.invalidateCache();
|
|
572
|
+
if (skipFirstResizeCallback) {
|
|
573
|
+
visualContainer.style.height = `${LayoutMetrics.current.bottomSheetHeight}px`;
|
|
574
|
+
prevHeaderHeight = LayoutMetrics.current.headerHeight;
|
|
575
|
+
prevContentHeight = LayoutMetrics.current.contentHeight;
|
|
576
|
+
prevFooterHeight = LayoutMetrics.current.footerHeight;
|
|
577
|
+
prevAvailableScrollHeight = LayoutMetrics.current.availableScrollHeight;
|
|
578
|
+
skipFirstResizeCallback = false;
|
|
579
|
+
return;
|
|
580
|
+
}
|
|
581
|
+
if (stateRef.current.heightAnimationDiff !== null) {
|
|
582
|
+
if (!collapseResizeCallbacks) {
|
|
583
|
+
// если предыдущая анимация не завершилась, без анимации сбрасываем высоту на вычисленную браузером
|
|
584
|
+
visualContainer.style.height = ``;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
else {
|
|
588
|
+
const contentHeightDiff = LayoutMetrics.current.contentHeight - prevContentHeight;
|
|
589
|
+
const containersHeightDiff = LayoutMetrics.current.headerHeight -
|
|
590
|
+
prevHeaderHeight +
|
|
591
|
+
LayoutMetrics.current.footerHeight -
|
|
592
|
+
prevFooterHeight;
|
|
593
|
+
// предположим, что scrollContainer останется таким же или станет меньше
|
|
594
|
+
// тогда можем рассчитать минимальную видимую высоту контента как min(scrollContainer.height, contentHeight)
|
|
595
|
+
const prevVisibleContentHeight = Math.min(prevAvailableScrollHeight, prevContentHeight);
|
|
596
|
+
const newMinVisibleContentHeight = Math.min(prevAvailableScrollHeight - containersHeightDiff, LayoutMetrics.current.contentHeight);
|
|
597
|
+
const minVisibleContentHeightDiff = newMinVisibleContentHeight - prevVisibleContentHeight;
|
|
598
|
+
// предположим, что scrollContainer станет больше
|
|
599
|
+
// тогда контент не может увеличиться больше, чем на расстояние между боттомшитом и верхним краем экрана
|
|
600
|
+
const maxVisibleContentHeightDiff = LayoutMetrics.current.remainingAvailableHeight - containersHeightDiff;
|
|
601
|
+
const visibleContentHeightDiff = Math.min(Math.max(contentHeightDiff, minVisibleContentHeightDiff), maxVisibleContentHeightDiff);
|
|
602
|
+
if (visibleContentHeightDiff !== 0) {
|
|
603
|
+
scrollContextProviderRef.current?.notify({ scrollTop: 0 });
|
|
604
|
+
}
|
|
605
|
+
const heightAnimationDiff = visibleContentHeightDiff + containersHeightDiff;
|
|
606
|
+
if (heightAnimationDiff !== 0) {
|
|
607
|
+
// запоминаем высоту scrollContainer после того, как боттомшиту будет присвоена новая высота.
|
|
608
|
+
// до этого значение некорректно, т.к. новый контент уже был отрендерен,
|
|
609
|
+
// но в инлайн-стилях боттомшита остается старая высота
|
|
610
|
+
stateRef.current.heightAnimationDiff = heightAnimationDiff;
|
|
611
|
+
stateRef.current.heightAnimationCallback = () => {
|
|
612
|
+
prevAvailableScrollHeight = LayoutMetrics.current.availableScrollHeight;
|
|
613
|
+
};
|
|
614
|
+
setHeightAnimationRunning(true);
|
|
615
|
+
collapseResizeCallbacks = true;
|
|
616
|
+
requestAnimationFrame(() => {
|
|
617
|
+
collapseResizeCallbacks = false;
|
|
618
|
+
});
|
|
619
|
+
}
|
|
620
|
+
else {
|
|
621
|
+
recalcContentOverlayPosition();
|
|
622
|
+
recalcScrollFlags();
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
prevHeaderHeight = LayoutMetrics.current.headerHeight;
|
|
626
|
+
prevContentHeight = LayoutMetrics.current.contentHeight;
|
|
627
|
+
prevFooterHeight = LayoutMetrics.current.footerHeight;
|
|
628
|
+
};
|
|
629
|
+
const resizeObserver = new ResizeObserver(handleHeightChange);
|
|
630
|
+
const content = contentRef.current;
|
|
631
|
+
const footer = footerRef.current;
|
|
632
|
+
const header = headerRef.current;
|
|
633
|
+
content !== null && resizeObserver.observe(content);
|
|
634
|
+
footer !== null && resizeObserver.observe(footer);
|
|
635
|
+
header !== null && header.addHeightObserver(handleHeightChange);
|
|
636
|
+
return () => {
|
|
637
|
+
resizeObserver.disconnect();
|
|
638
|
+
header !== null && header.removeHeightObserver(handleHeightChange);
|
|
639
|
+
};
|
|
640
|
+
}, [setHeightAnimationRunning, recalcScrollFlags, recalcContentOverlayPosition]);
|
|
636
641
|
const handleAppearAnimationEnd = useCallback(() => {
|
|
637
642
|
exitHandlersRef.current.push(...[initHeightObserver(), initTransformHandlers()].filter(Boolean));
|
|
638
643
|
onAppearRef.current?.();
|
|
@@ -657,12 +662,11 @@ const BottomSheetRenderFunc = ({ allowScrollWhileFocused, children, footer, head
|
|
|
657
662
|
}), ref: grabberRef }), jsx("div", { className: classnames(styles.visualContainer, {
|
|
658
663
|
[styles.visualContainerFullScreen]: height === 'full-screen',
|
|
659
664
|
[styles.heightTransitionAnimation]: heightTransition === 'entering',
|
|
660
|
-
}), "data-qa": appearTransition === 'entered' ? 'bottom-sheet-content' : undefined, ref: bottomSheetRef, children: jsxs(CustomScrollContextProvider, { ref: scrollContextProviderRef, children: [
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
}), ref: contentRef, children: jsx(BottomSheetContext.Provider, { value: contextValue, children: children }) }) }), jsxs("div", { className: styles.footer, ref: footerRef, children: [footer && (jsx("div", { className: classnames(styles.divider, {
|
|
665
|
+
}), "data-qa": appearTransition === 'entered' ? 'bottom-sheet-content' : undefined, ref: bottomSheetRef, children: jsxs(CustomScrollContextProvider, { ref: scrollContextProviderRef, children: [jsxs("div", { className: styles.scrollContainer, onFocus: handleFocus, ref: scrollContainerRef, children: [isNavigationBarComponent(header) && (jsx(NavigationBarComponent, { ...header.props, forwardedRef: headerRef })), jsx("div", { className: classnames(styles.content, {
|
|
666
|
+
[styles.contentFullScreen]: height === 'full-screen',
|
|
667
|
+
[styles.contentWithPaddings]: withContentPaddings,
|
|
668
|
+
[styles.contentSizedFullScreen]: isContentSizedFullHeight,
|
|
669
|
+
}), ref: contentRef, children: jsx(BottomSheetContext.Provider, { value: bottomSheetContext, children: children }) })] }), jsxs("div", { className: styles.footer, ref: footerRef, children: [footer && (jsx("div", { className: classnames(styles.divider, {
|
|
666
670
|
[styles.dividerVisible]: stateRef.current.dividerVisible,
|
|
667
671
|
}), ref: dividerRef, children: jsx(Divider, {}) })), interceptClickHandlers ? (jsx(ClickInterceptor, { children: clonedFooter })) : (clonedFooter)] })] }) }), jsx("div", { className: styles.contentOverlay, ref: contentOverlayRef })] })] }) }));
|
|
668
672
|
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);
|
package/BottomSheet.js.map
CHANGED
|
@@ -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 { 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 { InternalLayerName } from '@hh.ru/magritte-internal-layer-name';\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 { NavigationBarContext, NavigationBarContextProps } 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 NAVIGATION_BAR_CONTEXT_PROPS: NavigationBarContextProps = { insideBottomSheet: true };\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 isSafariFunc = () => {\n let lazyValue: boolean | null = null;\n return () => {\n if (lazyValue === null) {\n lazyValue = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n }\n return lazyValue;\n };\n};\n\nconst toNumber = (value: string) => {\n const result = parseInt(value, 10);\n return Number.isInteger(result) ? result : 0;\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 // число, на которое нужно анимировать изменение высоты контента боттомшита\n heightAnimationDiff: number | null;\n heightAnimationCallback?: VoidFunction | null;\n};\n\nconst INITIAL_STATE: State = {\n dividerVisible: false,\n grabberUnsafe: false,\n hasFocus: false,\n resizeRAFHandle: null,\n scrollOffset: 0,\n swipeOffset: 0,\n touchAction: null,\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 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 footerRef = useRef<HTMLDivElement>(null);\n const grabberRef = useRef<HTMLDivElement>(null);\n const headerRef = useRef<HTMLDivElement>(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\n const { isMobile } = useBreakpoint();\n const currentVisible = 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>({ ...INITIAL_STATE });\n const [animationTimeout, setAnimationTimeout] = useState<AnimationTimeout | null>(null);\n const [heightAnimationRunning, setHeightAnimationRunning] = useState(false);\n const contextValue = useMemo(() => ({ contentOverlayRef }), [contentOverlayRef]);\n const isSafari = useRef(isSafariFunc()).current;\n const scrollContextProviderRef = useRef<CustomScrollContextNotifier>(null);\n const exitHandlersRef = useRef<Array<VoidFunction>>([]);\n const isContentSizedFullHeight = isValidTreeSelectorWrapper(children);\n\n const LayoutMetrics = useRef(\n (() => {\n let cachedBottomSheetHeight: number | null = null;\n let cachedContentHeight: number | null = null;\n let cachedFooterHeight: number | null = null;\n let cachedHeaderHeight: number | null = null;\n let cachedInitialOffset: number | null = null;\n let cachedRemainingAvailableHeight: number | null = null;\n let cachedScrollContainerHeight: number | null = null;\n return {\n get bottomSheetHeight() {\n if (cachedBottomSheetHeight === null && visualContainerRef.current !== null) {\n cachedBottomSheetHeight = visualContainerRef.current.clientHeight;\n }\n return cachedBottomSheetHeight ?? 0;\n },\n get contentHeight() {\n if (cachedContentHeight === null && contentRef.current !== null) {\n cachedContentHeight = contentRef.current.clientHeight;\n }\n return cachedContentHeight ?? 0;\n },\n get footerHeight() {\n if (cachedFooterHeight === null && footerRef.current !== null) {\n cachedFooterHeight = footerRef.current.clientHeight;\n }\n return cachedFooterHeight ?? 0;\n },\n get headerHeight() {\n if (cachedHeaderHeight === null && headerRef.current !== null) {\n cachedHeaderHeight = headerRef.current.clientHeight;\n }\n return cachedHeaderHeight ?? 0;\n },\n get initialOffset() {\n if (\n cachedInitialOffset === null &&\n visualContainerRef.current !== null &&\n visualViewport !== null\n ) {\n cachedInitialOffset =\n height === 'half-screen'\n ? Math.max(\n Math.round(visualContainerRef.current.clientHeight - visualViewport.height / 2),\n 0\n )\n : 0;\n }\n return cachedInitialOffset ?? 0;\n },\n get remainingAvailableHeight() {\n if (cachedRemainingAvailableHeight === null && grabberRef.current !== null) {\n cachedRemainingAvailableHeight = grabberRef.current.offsetTop;\n }\n return cachedRemainingAvailableHeight ?? 0;\n },\n get scrollContainerHeight() {\n if (cachedScrollContainerHeight === null && scrollContainerRef.current !== null) {\n cachedScrollContainerHeight = scrollContainerRef.current.clientHeight;\n }\n return cachedScrollContainerHeight ?? 0;\n },\n invalidateCache() {\n cachedBottomSheetHeight = null;\n cachedContentHeight = null;\n cachedFooterHeight = null;\n cachedHeaderHeight = null;\n cachedInitialOffset = null;\n cachedRemainingAvailableHeight = null;\n cachedScrollContainerHeight = null;\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 // при изменении высоты контента анимируем ее\n // задаем боттомшиту фиксированную высоту и пересчитываем ее самостоятельно,\n // чтобы не было мерцания, когда новый контент отрисовался до срабатывания колбека ResizeObserver\n const initHeightObserver = useCallback(() => {\n if (!contentRef.current || !footerRef.current || !headerRef.current || !visualContainerRef.current) {\n return void 0;\n }\n\n const visualContainer = visualContainerRef.current;\n let prevContentHeight = 0;\n let prevHeaderHeight = 0;\n let prevFooterHeight = 0;\n let prevScrollContainerHeight = 0;\n let skipFirst = true;\n\n const observer = new ResizeObserver(() => {\n LayoutMetrics.current.invalidateCache();\n\n if (skipFirst) {\n visualContainer.style.height = `${LayoutMetrics.current.bottomSheetHeight}px`;\n prevHeaderHeight = LayoutMetrics.current.headerHeight;\n prevContentHeight = LayoutMetrics.current.contentHeight;\n prevFooterHeight = LayoutMetrics.current.footerHeight;\n prevScrollContainerHeight = LayoutMetrics.current.scrollContainerHeight;\n\n skipFirst = false;\n return;\n }\n\n if (stateRef.current.heightAnimationDiff !== null) {\n // если предыдущая анимация не завершилась, без анимации сбрасываем высоту на вычисленную браузером\n visualContainer.style.height = ``;\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(prevScrollContainerHeight, prevContentHeight);\n const newMinVisibleContentHeight = Math.min(\n prevScrollContainerHeight - 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 scrollContextProviderRef.current?.notify({ scrollTop: 0 });\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 prevScrollContainerHeight = LayoutMetrics.current.scrollContainerHeight;\n };\n\n setHeightAnimationRunning(true);\n }\n }\n\n prevHeaderHeight = LayoutMetrics.current.headerHeight;\n prevContentHeight = LayoutMetrics.current.contentHeight;\n prevFooterHeight = LayoutMetrics.current.footerHeight;\n });\n\n observer.observe(headerRef.current);\n observer.observe(contentRef.current);\n observer.observe(footerRef.current);\n return () => observer.disconnect();\n }, [setHeightAnimationRunning]);\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'] = 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, isSafari, keyboardOverlaysContent]);\n\n const recalcKeyboardOffsets = useCallback(() => {\n if (!headerRef.current || !overlayRef.current || !visualViewport) {\n return;\n }\n\n if (stateRef.current.hasFocus) {\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 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 headerDOMRect = headerRef.current.getBoundingClientRect();\n const headerOutOfViewportHeight = Math.round(\n headerDOMRect.bottom + layoutViewportDiff - DOCUMENT_HEIGHT.current\n );\n if (headerOutOfViewportHeight > 0) {\n setCSSVariable(\n CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET,\n `${headerOutOfViewportHeight - layoutViewportDiff}px`\n );\n }\n }\n }\n\n // keyboardOverlaysContent=false, клавиатура ПОД контентом\n // этот кейс нужно корректировать только в Safari\n if (!keyboardOverlaysContent && isSafari()) {\n const visualViewportDiff = Math.round(overlayDOMRect.bottom - visualViewport.height);\n if (visualViewportDiff > 0) {\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET, `${visualViewportShift}px`);\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 }, [isSafari, 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 (!(focusedElement instanceof HTMLInputElement) || 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 (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 };\n\n stateRef.current.hasFocus = true;\n stateRef.current.resizeRAFHandle = requestAnimationFrame(waitForResize);\n visualViewport?.addEventListener('resize', handleResize);\n focusedElement.addEventListener('blur', handleBlur);\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 = `${\n scrollContainerRef.current.offsetTop + visualContainerRef.current.offsetTop\n }px`;\n contentOverlayRef.current.style.height = `${scrollContainerRef.current.clientHeight}px`;\n }\n }, []);\n\n const recalcScrollFlags = useCallback(() => {\n if (dividerRef.current !== null) {\n const prevDividerVisible = stateRef.current.dividerVisible;\n const isNotScrolledToEnd =\n LayoutMetrics.current.contentHeight + stateRef.current.scrollOffset >\n LayoutMetrics.current.scrollContainerHeight;\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(stateRef.current.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 scrollContextProviderRef.current?.notify({ scrollTop: 0 });\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 = { ...INITIAL_STATE };\n\n exitHandlersRef.current.forEach((handler) => handler());\n exitHandlersRef.current = [];\n onAfterExit?.();\n }, [onAfterExit]);\n\n const handleHeightAnimationStart = useCallback(() => {\n LayoutMetrics.current.invalidateCache();\n\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 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 }, [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 if (!visualContainerRef.current) {\n return void 0;\n }\n\n const handleScroll = (delta: number) => {\n if (\n LayoutMetrics.current.initialOffset !== 0 ||\n LayoutMetrics.current.contentHeight > LayoutMetrics.current.scrollContainerHeight\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.scrollContainerHeight\n ) {\n // скролла нет (touchAction is null)\n // либо контент проскроллен до конца, тогда не даем скроллить дальше\n newScrollOffset = LayoutMetrics.current.scrollContainerHeight - 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 });\n }\n }\n };\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 ) {\n return;\n }\n handleScroll(event.delta);\n };\n\n const onWheelMove = (event: ScrollGestureEvent) => {\n if (!allowScrollWhileFocused && stateRef.current.hasFocus) {\n return;\n }\n handleScroll(event.delta);\n };\n\n const onTouchEnd = () => {\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 swipeHandlers.onTouchStart(event);\n };\n\n const handleTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n swipeHandlers.onTouchMove(event);\n };\n\n const removeScrollHandlers = initScrollHandlers({\n axis: 'vertical',\n wrapperRef: visualContainerRef,\n onTouchMove,\n onTouchEnd,\n onWheelMove,\n });\n const visualContainer = visualContainerRef.current;\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 const handleAppearAnimationEnd = useCallback(() => {\n exitHandlersRef.current.push(\n ...([initHeightObserver(), initTransformHandlers()].filter(Boolean) as VoidFunction[])\n );\n onAppearRef.current?.();\n }, [initHeightObserver, initTransformHandlers]);\n\n const { onTouchEnd, ...eventHandlers } = useNoBubbling();\n\n if (!animationTimeout) {\n return null;\n }\n\n const clonedFooter =\n footer && isActionBarComponent(footer) ? cloneElement(footer, { type: footer.props.type || 'mobile' }) : footer;\n\n const renderFunc = (appearTransition: TransitionStatus, heightTransition: TransitionStatus) => (\n <Layer layer={InternalLayerName.BottomSheet}>\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 <CustomScrollContextProvider ref={scrollContextProviderRef}>\n <div className={styles.header} onFocus={handleFocus} ref={headerRef}>\n <NavigationBarContext.Provider value={NAVIGATION_BAR_CONTEXT_PROPS}>\n {header}\n </NavigationBarContext.Provider>\n </div>\n <div className={styles.scrollContainer} ref={scrollContainerRef}>\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={contextValue}>\n {children}\n </BottomSheetContext.Provider>\n </div>\n </div>\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 ? (\n <ClickInterceptor>{clonedFooter}</ClickInterceptor>\n ) : (\n clonedFooter\n )}\n </div>\n </CustomScrollContextProvider>\n </div>\n <div className={styles.contentOverlay} ref={contentOverlayRef} />\n </div>\n </div>\n </Layer>\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 { 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 { InternalLayerName } from '@hh.ru/magritte-internal-layer-name';\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 isSafariFunc = () => {\n let lazyValue: boolean | null = null;\n return () => {\n if (lazyValue === null) {\n lazyValue = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n }\n return lazyValue;\n };\n};\n\nconst toNumber = (value: string) => {\n const result = parseInt(value, 10);\n return Number.isInteger(result) ? result : 0;\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 // число, на которое нужно анимировать изменение высоты контента боттомшита\n heightAnimationDiff: number | null;\n heightAnimationCallback?: VoidFunction | null;\n};\n\nconst INITIAL_STATE: State = {\n dividerVisible: false,\n grabberUnsafe: false,\n hasFocus: false,\n resizeRAFHandle: null,\n scrollOffset: 0,\n swipeOffset: 0,\n touchAction: null,\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 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 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\n const { isMobile } = useBreakpoint();\n const currentVisible = 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>({ ...INITIAL_STATE });\n const [animationTimeout, setAnimationTimeout] = useState<AnimationTimeout | null>(null);\n const [heightAnimationRunning, setHeightAnimationRunning] = useState(false);\n const bottomSheetContext = useMemo(() => ({ contentOverlayRef }), [contentOverlayRef]);\n const isSafari = useRef(isSafariFunc()).current;\n const scrollContextProviderRef = useRef<CustomScrollContextNotifier>(null);\n const exitHandlersRef = useRef<Array<VoidFunction>>([]);\n const isContentSizedFullHeight = isValidTreeSelectorWrapper(children);\n\n const LayoutMetrics = useRef(\n (() => {\n let cache: Record<string, number> = {};\n return {\n get availableScrollHeight() {\n if (!('availableScrollHeight' in cache) && scrollContainerRef.current !== null) {\n cache.availableScrollHeight =\n scrollContainerRef.current.clientHeight - LayoutMetrics.current.headerHeight;\n }\n return cache.availableScrollHeight ?? 0;\n },\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 get contentHeight() {\n if (!('contentHeight' in cache) && contentRef.current !== null) {\n cache.contentHeight = contentRef.current.clientHeight;\n }\n return cache.contentHeight ?? 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 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) && visualContainerRef.current !== null && visualViewport !== null) {\n cache.initialOffset =\n height === 'half-screen'\n ? Math.max(\n Math.round(visualContainerRef.current.clientHeight - visualViewport.height / 2),\n 0\n )\n : 0;\n }\n return cache.initialOffset ?? 0;\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'] = 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, isSafari, keyboardOverlaysContent]);\n\n const recalcKeyboardOffsets = useCallback(() => {\n if (!headerRef.current || !overlayRef.current || !visualViewport) {\n return;\n }\n\n if (stateRef.current.hasFocus) {\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 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 headerOutOfViewportHeight = Math.round(\n headerRef.current.bottom + layoutViewportDiff - DOCUMENT_HEIGHT.current\n );\n if (headerOutOfViewportHeight > 0) {\n setCSSVariable(\n CSS_VAR_VIRTUAL_KEYBOARD_BOTTOM_OFFSET,\n `${headerOutOfViewportHeight - layoutViewportDiff}px`\n );\n }\n }\n }\n\n // keyboardOverlaysContent=false, клавиатура ПОД контентом\n // этот кейс нужно корректировать только в Safari\n if (!keyboardOverlaysContent && isSafari()) {\n const visualViewportDiff = Math.round(overlayDOMRect.bottom - visualViewport.height);\n if (visualViewportDiff > 0) {\n setCSSVariable(CSS_VAR_VIRTUAL_KEYBOARD_TOP_OFFSET, `${visualViewportShift}px`);\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 }, [isSafari, 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 (!(focusedElement instanceof HTMLInputElement) || 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 (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 };\n\n stateRef.current.hasFocus = true;\n stateRef.current.resizeRAFHandle = requestAnimationFrame(waitForResize);\n visualViewport?.addEventListener('resize', handleResize);\n focusedElement.addEventListener('blur', handleBlur);\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 const visibleHeaderHeight = headerRef.current?.visibleHeight ?? 0;\n contentOverlayRef.current.style.top = `${\n scrollContainerRef.current.offsetTop + visualContainerRef.current.offsetTop + visibleHeaderHeight\n }px`;\n contentOverlayRef.current.style.height = `${LayoutMetrics.current.availableScrollHeight}px`;\n }\n }, []);\n\n const recalcScrollFlags = useCallback(() => {\n if (dividerRef.current !== null) {\n const prevDividerVisible = stateRef.current.dividerVisible;\n const isNotScrolledToEnd =\n LayoutMetrics.current.contentHeight + stateRef.current.scrollOffset >\n LayoutMetrics.current.availableScrollHeight;\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(stateRef.current.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 scrollContextProviderRef.current?.notify({ scrollTop: 0 });\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 = { ...INITIAL_STATE };\n\n exitHandlersRef.current.forEach((handler) => handler());\n exitHandlersRef.current = [];\n onAfterExit?.();\n }, [onAfterExit]);\n\n const handleHeightAnimationStart = useCallback(() => {\n LayoutMetrics.current.invalidateCache();\n\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 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({ scrollTop: 0 });\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 if (!visualContainerRef.current) {\n return void 0;\n }\n\n const handleScroll = (delta: number) => {\n if (\n LayoutMetrics.current.initialOffset !== 0 ||\n LayoutMetrics.current.contentHeight > LayoutMetrics.current.availableScrollHeight\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.availableScrollHeight\n ) {\n // скролла нет (touchAction is null)\n // либо контент проскроллен до конца, тогда не даем скроллить дальше\n newScrollOffset = LayoutMetrics.current.availableScrollHeight - 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 });\n }\n }\n };\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 ) {\n return;\n }\n handleScroll(event.delta);\n };\n\n const onWheelMove = (event: ScrollGestureEvent) => {\n if (!allowScrollWhileFocused && stateRef.current.hasFocus) {\n return;\n }\n handleScroll(event.delta);\n };\n\n const onTouchEnd = () => {\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 swipeHandlers.onTouchStart(event);\n };\n\n const handleTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n swipeHandlers.onTouchMove(event);\n };\n\n const removeScrollHandlers = initScrollHandlers({\n axis: 'vertical',\n wrapperRef: visualContainerRef,\n onTouchMove,\n onTouchEnd,\n onWheelMove,\n });\n const visualContainer = visualContainerRef.current;\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 prevAvailableScrollHeight = 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 prevAvailableScrollHeight = LayoutMetrics.current.availableScrollHeight;\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(prevAvailableScrollHeight, prevContentHeight);\n const newMinVisibleContentHeight = Math.min(\n prevAvailableScrollHeight - 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 scrollContextProviderRef.current?.notify({ scrollTop: 0 });\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 prevAvailableScrollHeight = LayoutMetrics.current.availableScrollHeight;\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]);\n\n const handleAppearAnimationEnd = useCallback(() => {\n exitHandlersRef.current.push(\n ...([initHeightObserver(), initTransformHandlers()].filter(Boolean) as VoidFunction[])\n );\n onAppearRef.current?.();\n }, [initHeightObserver, initTransformHandlers]);\n\n const { onTouchEnd, ...eventHandlers } = useNoBubbling();\n\n if (!animationTimeout) {\n return null;\n }\n\n const clonedFooter =\n footer && isActionBarComponent(footer) ? cloneElement(footer, { type: footer.props.type || 'mobile' }) : footer;\n\n const renderFunc = (appearTransition: TransitionStatus, heightTransition: TransitionStatus) => (\n <Layer layer={InternalLayerName.BottomSheet}>\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 <CustomScrollContextProvider ref={scrollContextProviderRef}>\n <div className={styles.scrollContainer} onFocus={handleFocus} ref={scrollContainerRef}>\n {isNavigationBarComponent(header) && (\n <NavigationBarComponent {...header.props} forwardedRef={headerRef} />\n )}\n <div\n className={classnames(styles.content, {\n [styles.contentFullScreen]: height === 'full-screen',\n [styles.contentWithPaddings]: withContentPaddings,\n [styles.contentSizedFullScreen]: isContentSizedFullHeight,\n })}\n ref={contentRef}\n >\n <BottomSheetContext.Provider value={bottomSheetContext}>\n {children}\n </BottomSheetContext.Provider>\n </div>\n </div>\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 ? (\n <ClickInterceptor>{clonedFooter}</ClickInterceptor>\n ) : (\n clonedFooter\n )}\n </div>\n </CustomScrollContextProvider>\n </div>\n <div className={styles.contentOverlay} ref={contentOverlayRef} />\n </div>\n </div>\n </Layer>\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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"}
|
package/BottomSheetFooter.js
CHANGED
|
@@ -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-
|
|
3
|
+
import { s as styles } from './bottom-sheet-Ci2VSfuH.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_5-4-0","flexContainer":"magritte-flex-container___muHAx_5-4-0","animation-timeout":"magritte-animation-timeout___yd-SZ_5-4-0","animationTimeout":"magritte-animation-timeout___yd-SZ_5-4-0","css-variables-container":"magritte-css-variables-container___jBCr9_5-4-0","cssVariablesContainer":"magritte-css-variables-container___jBCr9_5-4-0","appear-animation":"magritte-appear-animation___P84Ln_5-4-0","appearAnimation":"magritte-appear-animation___P84Ln_5-4-0","disappear-animation":"magritte-disappear-animation___Putks_5-4-0","disappearAnimation":"magritte-disappear-animation___Putks_5-4-0","grabber-transition-animation":"magritte-grabber-transition-animation___s3Oh4_5-4-0","grabberTransitionAnimation":"magritte-grabber-transition-animation___s3Oh4_5-4-0","height-transition-animation":"magritte-height-transition-animation___xNprr_5-4-0","heightTransitionAnimation":"magritte-height-transition-animation___xNprr_5-4-0","close-by-swipe-animation":"magritte-close-by-swipe-animation___wdezY_5-4-0","closeBySwipeAnimation":"magritte-close-by-swipe-animation___wdezY_5-4-0","swipe-cancel-animation":"magritte-swipe-cancel-animation___AhYj5_5-4-0","swipeCancelAnimation":"magritte-swipe-cancel-animation___AhYj5_5-4-0","overlay":"magritte-overlay___5a2U-_5-4-0","overlay-background":"magritte-overlay-background___8Sd4V_5-4-0","overlayBackground":"magritte-overlay-background___8Sd4V_5-4-0","overlay-background_visible":"magritte-overlay-background_visible___FOJgj_5-4-0","overlayBackgroundVisible":"magritte-overlay-background_visible___FOJgj_5-4-0","swipe-container":"magritte-swipe-container___sZ2n5_5-4-0","swipeContainer":"magritte-swipe-container___sZ2n5_5-4-0","grabber":"magritte-grabber___A7SB-_5-4-0","grabber_ensure-safe":"magritte-grabber_ensure-safe___DR-dV_5-4-0","grabberEnsureSafe":"magritte-grabber_ensure-safe___DR-dV_5-4-0","visual-container":"magritte-visual-container___-VSuY_5-4-0","visualContainer":"magritte-visual-container___-VSuY_5-4-0","visual-container_full-screen":"magritte-visual-container_full-screen___jCCBb_5-4-0","visualContainerFullScreen":"magritte-visual-container_full-screen___jCCBb_5-4-0","scroll-container":"magritte-scroll-container___4ngNY_5-4-0","scrollContainer":"magritte-scroll-container___4ngNY_5-4-0","content":"magritte-content___1gAwP_5-4-0","content_full-screen":"magritte-content_full-screen___2SFaO_5-4-0","contentFullScreen":"magritte-content_full-screen___2SFaO_5-4-0","content_sized-full-screen":"magritte-content_sized-full-screen___45pa6_5-4-0","contentSizedFullScreen":"magritte-content_sized-full-screen___45pa6_5-4-0","content_with-paddings":"magritte-content_with-paddings___gIiAv_5-4-0","contentWithPaddings":"magritte-content_with-paddings___gIiAv_5-4-0","footer":"magritte-footer___RWslT_5-4-0","footer-with-padding":"magritte-footer-with-padding___KwkhC_5-4-0","footerWithPadding":"magritte-footer-with-padding___KwkhC_5-4-0","divider":"magritte-divider___0F8hh_5-4-0","divider_visible":"magritte-divider_visible___pAWZM_5-4-0","dividerVisible":"magritte-divider_visible___pAWZM_5-4-0","content-overlay":"magritte-content-overlay___HAyzL_5-4-0","contentOverlay":"magritte-content-overlay___HAyzL_5-4-0"};
|
|
3
|
+
|
|
4
|
+
export { styles as s };
|
|
5
|
+
//# sourceMappingURL=bottom-sheet-Ci2VSfuH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bottom-sheet-Ci2VSfuH.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
package/index.css
CHANGED
|
@@ -19,13 +19,13 @@
|
|
|
19
19
|
--magritte-color-component-bottom-sheet-grabber-content-v19-1-0:#c6c6c68f;
|
|
20
20
|
--magritte-color-component-_overlay-background-content-v19-1-0:#26262699;
|
|
21
21
|
}
|
|
22
|
-
.magritte-flex-container___muHAx_5-
|
|
22
|
+
.magritte-flex-container___muHAx_5-4-0{
|
|
23
23
|
display:flex;
|
|
24
24
|
flex-direction:column;
|
|
25
25
|
align-items:stretch;
|
|
26
26
|
}
|
|
27
|
-
.magritte-animation-timeout___yd-SZ_5-
|
|
28
|
-
.magritte-css-variables-container___jBCr9_5-
|
|
27
|
+
.magritte-animation-timeout___yd-SZ_5-4-0,
|
|
28
|
+
.magritte-css-variables-container___jBCr9_5-4-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_5-
|
|
39
|
-
.magritte-css-variables-container___jBCr9_5-
|
|
38
|
+
.magritte-animation-timeout___yd-SZ_5-4-0,
|
|
39
|
+
.magritte-css-variables-container___jBCr9_5-4-0{
|
|
40
40
|
--enter-animation-duration:var(--magritte-semantic-animation-ease-in-out-300-duration-v19-1-0);
|
|
41
41
|
--exit-animation-duration:var(--magritte-semantic-animation-ease-in-out-200-duration-v19-1-0);
|
|
42
42
|
--grabber-animation-duration:var(--magritte-semantic-animation-ease-in-out-200-duration-v19-1-0);
|
|
@@ -44,52 +44,52 @@
|
|
|
44
44
|
--swipe-cancel-transition-duration:var(--magritte-semantic-animation-ease-in-out-100-duration-v19-1-0);
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
|
-
.magritte-appear-animation___P84Ln_5-
|
|
47
|
+
.magritte-appear-animation___P84Ln_5-4-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-v19-1-0);
|
|
51
51
|
}
|
|
52
|
-
.magritte-disappear-animation___Putks_5-
|
|
52
|
+
.magritte-disappear-animation___Putks_5-4-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-v19-1-0);
|
|
56
56
|
}
|
|
57
|
-
.magritte-grabber-transition-animation___s3Oh4_5-
|
|
57
|
+
.magritte-grabber-transition-animation___s3Oh4_5-4-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-v19-1-0);
|
|
61
61
|
}
|
|
62
|
-
.magritte-height-transition-animation___xNprr_5-
|
|
62
|
+
.magritte-height-transition-animation___xNprr_5-4-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-v19-1-0);
|
|
66
66
|
}
|
|
67
|
-
.magritte-close-by-swipe-animation___wdezY_5-
|
|
67
|
+
.magritte-close-by-swipe-animation___wdezY_5-4-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_5-
|
|
72
|
+
.magritte-swipe-cancel-animation___AhYj5_5-4-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-v19-1-0);
|
|
76
76
|
}
|
|
77
|
-
.magritte-overlay___5a2U-_5-
|
|
77
|
+
.magritte-overlay___5a2U-_5-4-0{
|
|
78
78
|
pointer-events:none;
|
|
79
79
|
position:fixed;
|
|
80
80
|
inset:0;
|
|
81
81
|
}
|
|
82
|
-
.magritte-overlay-background___8Sd4V_5-
|
|
82
|
+
.magritte-overlay-background___8Sd4V_5-4-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_5-
|
|
88
|
+
.magritte-overlay-background_visible___FOJgj_5-4-0{
|
|
89
89
|
pointer-events:initial;
|
|
90
90
|
background-color:var(--magritte-color-component-_overlay-background-content-v19-1-0);
|
|
91
91
|
}
|
|
92
|
-
.magritte-swipe-container___sZ2n5_5-
|
|
92
|
+
.magritte-swipe-container___sZ2n5_5-4-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-_5-
|
|
102
|
+
.magritte-grabber___A7SB-_5-4-0{
|
|
103
103
|
flex:0 0 20px;
|
|
104
104
|
position:relative;
|
|
105
105
|
}
|
|
106
|
-
.magritte-grabber___A7SB-_5-
|
|
106
|
+
.magritte-grabber___A7SB-_5-4-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-v19-1-0);
|
|
115
115
|
z-index:3;
|
|
116
116
|
}
|
|
117
|
-
.magritte-grabber_ensure-safe___DR-dV_5-
|
|
117
|
+
.magritte-grabber_ensure-safe___DR-dV_5-4-0::after{
|
|
118
118
|
transform:translateY(20px);
|
|
119
119
|
}
|
|
120
|
-
.magritte-visual-container___-VSuY_5-
|
|
120
|
+
.magritte-visual-container___-VSuY_5-4-0{
|
|
121
121
|
display:flex;
|
|
122
122
|
flex-direction:column;
|
|
123
123
|
align-items:stretch;
|
|
@@ -130,18 +130,13 @@
|
|
|
130
130
|
overflow:clip;
|
|
131
131
|
user-select:text;
|
|
132
132
|
}
|
|
133
|
-
.magritte-visual-container_full-screen___jCCBb_5-
|
|
133
|
+
.magritte-visual-container_full-screen___jCCBb_5-4-0{
|
|
134
134
|
flex:1 1 auto;
|
|
135
135
|
min-height:1px;
|
|
136
136
|
}
|
|
137
|
-
.magritte-
|
|
137
|
+
.magritte-scroll-container___4ngNY_5-4-0{
|
|
138
138
|
--magritte-ui-navigation-bar-background-override:var(--magritte-color-component-bottom-sheet-background-content-v19-1-0);
|
|
139
|
-
|
|
140
|
-
flex:0 0 auto;
|
|
141
|
-
padding-top:16px;
|
|
142
|
-
z-index:2;
|
|
143
|
-
}
|
|
144
|
-
.magritte-scroll-container___4ngNY_5-3-28{
|
|
139
|
+
--magritte-ui-navigation-bar-top-padding-override:16px;
|
|
145
140
|
display:flex;
|
|
146
141
|
flex-direction:column;
|
|
147
142
|
align-items:stretch;
|
|
@@ -149,7 +144,7 @@
|
|
|
149
144
|
min-height:1px;
|
|
150
145
|
z-index:1;
|
|
151
146
|
}
|
|
152
|
-
.magritte-content___1gAwP_5-
|
|
147
|
+
.magritte-content___1gAwP_5-4-0{
|
|
153
148
|
display:flex;
|
|
154
149
|
flex-direction:column;
|
|
155
150
|
align-items:stretch;
|
|
@@ -158,39 +153,36 @@
|
|
|
158
153
|
will-change:transform;
|
|
159
154
|
transform:translate3d(0, 0, 0);
|
|
160
155
|
}
|
|
161
|
-
.magritte-content_full-screen___2SFaO_5-
|
|
156
|
+
.magritte-content_full-screen___2SFaO_5-4-0{
|
|
162
157
|
flex:1 0 auto;
|
|
163
158
|
}
|
|
164
|
-
.magritte-content_sized-full-screen___45pa6_5-
|
|
159
|
+
.magritte-content_sized-full-screen___45pa6_5-4-0{
|
|
165
160
|
flex:1 1 auto;
|
|
166
161
|
min-height:1px;
|
|
167
162
|
}
|
|
168
|
-
.magritte-content_with-paddings___gIiAv_5-
|
|
163
|
+
.magritte-content_with-paddings___gIiAv_5-4-0{
|
|
169
164
|
padding:16px 16px 0;
|
|
170
165
|
}
|
|
171
|
-
.magritte-
|
|
172
|
-
padding:0 16px;
|
|
173
|
-
}
|
|
174
|
-
.magritte-footer___RWslT_5-3-28{
|
|
166
|
+
.magritte-footer___RWslT_5-4-0{
|
|
175
167
|
flex:0 0 auto;
|
|
176
168
|
background-color:var(--magritte-color-component-bottom-sheet-background-content-v19-1-0);
|
|
177
169
|
z-index:2;
|
|
178
170
|
will-change:transform;
|
|
179
171
|
transform:translate3d(0, 0, 0);
|
|
180
172
|
}
|
|
181
|
-
.magritte-footer-with-padding___KwkhC_5-
|
|
173
|
+
.magritte-footer-with-padding___KwkhC_5-4-0{
|
|
182
174
|
display:flex;
|
|
183
175
|
flex-direction:column;
|
|
184
176
|
gap:12px;
|
|
185
177
|
padding:16px;
|
|
186
178
|
}
|
|
187
|
-
.magritte-divider___0F8hh_5-
|
|
179
|
+
.magritte-divider___0F8hh_5-4-0{
|
|
188
180
|
visibility:hidden;
|
|
189
181
|
}
|
|
190
|
-
.magritte-divider_visible___pAWZM_5-
|
|
182
|
+
.magritte-divider_visible___pAWZM_5-4-0{
|
|
191
183
|
visibility:visible;
|
|
192
184
|
}
|
|
193
|
-
.magritte-content-overlay___HAyzL_5-
|
|
185
|
+
.magritte-content-overlay___HAyzL_5-4-0{
|
|
194
186
|
pointer-events:none;
|
|
195
187
|
position:absolute;
|
|
196
188
|
inset:0;
|
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-
|
|
25
|
+
import './bottom-sheet-Ci2VSfuH.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": "5.
|
|
3
|
+
"version": "5.4.0",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"types": "index.d.ts",
|
|
6
6
|
"sideEffects": [
|
|
@@ -28,14 +28,14 @@
|
|
|
28
28
|
"@hh.ru/magritte-design-tokens": "19.1.0",
|
|
29
29
|
"@hh.ru/magritte-internal-custom-scroll": "1.3.0",
|
|
30
30
|
"@hh.ru/magritte-internal-layer-name": "2.2.0",
|
|
31
|
-
"@hh.ru/magritte-ui-action-bar": "2.2.
|
|
31
|
+
"@hh.ru/magritte-ui-action-bar": "2.2.3",
|
|
32
32
|
"@hh.ru/magritte-ui-breakpoint": "4.0.3",
|
|
33
33
|
"@hh.ru/magritte-ui-divider": "1.1.33",
|
|
34
|
-
"@hh.ru/magritte-ui-layer": "2.0
|
|
34
|
+
"@hh.ru/magritte-ui-layer": "2.1.0",
|
|
35
35
|
"@hh.ru/magritte-ui-mock-component": "1.0.11",
|
|
36
|
-
"@hh.ru/magritte-ui-navigation-bar": "6.0
|
|
36
|
+
"@hh.ru/magritte-ui-navigation-bar": "6.1.0",
|
|
37
37
|
"@hh.ru/magritte-ui-theme-provider": "1.1.29",
|
|
38
|
-
"@hh.ru/magritte-ui-tree-selector": "4.4.
|
|
38
|
+
"@hh.ru/magritte-ui-tree-selector": "4.4.10"
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
41
41
|
"classnames": ">=2.3.2",
|
|
@@ -46,5 +46,5 @@
|
|
|
46
46
|
"publishConfig": {
|
|
47
47
|
"access": "public"
|
|
48
48
|
},
|
|
49
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "bb35332dfb405728ad722c4652abbef263bb973c"
|
|
50
50
|
}
|
package/bottom-sheet-yGI7jsKt.js
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import './index.css';
|
|
2
|
-
var styles = {"flex-container":"magritte-flex-container___muHAx_5-3-28","flexContainer":"magritte-flex-container___muHAx_5-3-28","animation-timeout":"magritte-animation-timeout___yd-SZ_5-3-28","animationTimeout":"magritte-animation-timeout___yd-SZ_5-3-28","css-variables-container":"magritte-css-variables-container___jBCr9_5-3-28","cssVariablesContainer":"magritte-css-variables-container___jBCr9_5-3-28","appear-animation":"magritte-appear-animation___P84Ln_5-3-28","appearAnimation":"magritte-appear-animation___P84Ln_5-3-28","disappear-animation":"magritte-disappear-animation___Putks_5-3-28","disappearAnimation":"magritte-disappear-animation___Putks_5-3-28","grabber-transition-animation":"magritte-grabber-transition-animation___s3Oh4_5-3-28","grabberTransitionAnimation":"magritte-grabber-transition-animation___s3Oh4_5-3-28","height-transition-animation":"magritte-height-transition-animation___xNprr_5-3-28","heightTransitionAnimation":"magritte-height-transition-animation___xNprr_5-3-28","close-by-swipe-animation":"magritte-close-by-swipe-animation___wdezY_5-3-28","closeBySwipeAnimation":"magritte-close-by-swipe-animation___wdezY_5-3-28","swipe-cancel-animation":"magritte-swipe-cancel-animation___AhYj5_5-3-28","swipeCancelAnimation":"magritte-swipe-cancel-animation___AhYj5_5-3-28","overlay":"magritte-overlay___5a2U-_5-3-28","overlay-background":"magritte-overlay-background___8Sd4V_5-3-28","overlayBackground":"magritte-overlay-background___8Sd4V_5-3-28","overlay-background_visible":"magritte-overlay-background_visible___FOJgj_5-3-28","overlayBackgroundVisible":"magritte-overlay-background_visible___FOJgj_5-3-28","swipe-container":"magritte-swipe-container___sZ2n5_5-3-28","swipeContainer":"magritte-swipe-container___sZ2n5_5-3-28","grabber":"magritte-grabber___A7SB-_5-3-28","grabber_ensure-safe":"magritte-grabber_ensure-safe___DR-dV_5-3-28","grabberEnsureSafe":"magritte-grabber_ensure-safe___DR-dV_5-3-28","visual-container":"magritte-visual-container___-VSuY_5-3-28","visualContainer":"magritte-visual-container___-VSuY_5-3-28","visual-container_full-screen":"magritte-visual-container_full-screen___jCCBb_5-3-28","visualContainerFullScreen":"magritte-visual-container_full-screen___jCCBb_5-3-28","header":"magritte-header___5mMtj_5-3-28","scroll-container":"magritte-scroll-container___4ngNY_5-3-28","scrollContainer":"magritte-scroll-container___4ngNY_5-3-28","content":"magritte-content___1gAwP_5-3-28","content_full-screen":"magritte-content_full-screen___2SFaO_5-3-28","contentFullScreen":"magritte-content_full-screen___2SFaO_5-3-28","content_sized-full-screen":"magritte-content_sized-full-screen___45pa6_5-3-28","contentSizedFullScreen":"magritte-content_sized-full-screen___45pa6_5-3-28","content_with-paddings":"magritte-content_with-paddings___gIiAv_5-3-28","contentWithPaddings":"magritte-content_with-paddings___gIiAv_5-3-28","content_without-header":"magritte-content_without-header___YZR38_5-3-28","contentWithoutHeader":"magritte-content_without-header___YZR38_5-3-28","footer":"magritte-footer___RWslT_5-3-28","footer-with-padding":"magritte-footer-with-padding___KwkhC_5-3-28","footerWithPadding":"magritte-footer-with-padding___KwkhC_5-3-28","divider":"magritte-divider___0F8hh_5-3-28","divider_visible":"magritte-divider_visible___pAWZM_5-3-28","dividerVisible":"magritte-divider_visible___pAWZM_5-3-28","content-overlay":"magritte-content-overlay___HAyzL_5-3-28","contentOverlay":"magritte-content-overlay___HAyzL_5-3-28"};
|
|
3
|
-
|
|
4
|
-
export { styles as s };
|
|
5
|
-
//# sourceMappingURL=bottom-sheet-yGI7jsKt.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bottom-sheet-yGI7jsKt.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|