@phpsoftbox/react-softbox 2.8.1 → 2.8.2
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.
|
@@ -1,18 +1,33 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? React.useLayoutEffect : React.useEffect;
|
|
3
3
|
const fixedPositionSettleMs = 500;
|
|
4
|
+
const isSameStyle = (a, b) => {
|
|
5
|
+
const keys = new Set([...Object.keys(a), ...Object.keys(b)]);
|
|
6
|
+
for (const key of keys) {
|
|
7
|
+
if (a[key] !== b[key]) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return true;
|
|
12
|
+
};
|
|
4
13
|
export default function useDropdownPosition(open, options = {}) {
|
|
5
14
|
const { gap = 8, align = 'right', placement: requestedPlacement = 'auto', anchorRef, strategy = 'absolute' } = options;
|
|
6
15
|
const ref = React.useRef(null);
|
|
7
16
|
const lockedPlacementRef = React.useRef(null);
|
|
8
|
-
const [style,
|
|
17
|
+
const [style, setStyleState] = React.useState({});
|
|
18
|
+
const setStyle = React.useCallback((next) => {
|
|
19
|
+
setStyleState((prev) => (isSameStyle(prev, next) ? prev : next));
|
|
20
|
+
}, []);
|
|
9
21
|
const [currentPlacement, setCurrentPlacement] = React.useState('down');
|
|
10
22
|
const clamp = (value, min, max) => Math.min(Math.max(value, min), max);
|
|
11
23
|
const compute = React.useCallback(() => {
|
|
12
24
|
if (!ref.current) {
|
|
13
25
|
return;
|
|
14
26
|
}
|
|
15
|
-
const
|
|
27
|
+
const element = ref.current;
|
|
28
|
+
const rect = element.getBoundingClientRect();
|
|
29
|
+
// Натуральная высота контента, не зависящая от уже применённого max-height.
|
|
30
|
+
const contentHeight = element.scrollHeight + (element.offsetHeight - element.clientHeight);
|
|
16
31
|
const anchorRect = anchorRef?.current?.getBoundingClientRect() ?? rect;
|
|
17
32
|
const padding = 12;
|
|
18
33
|
const availableWidth = window.innerWidth - padding * 2;
|
|
@@ -34,7 +49,7 @@ export default function useDropdownPosition(open, options = {}) {
|
|
|
34
49
|
maxWidth = availableWidth;
|
|
35
50
|
}
|
|
36
51
|
if (requestedPlacement === 'auto' && !lockedPlacementRef.current) {
|
|
37
|
-
if (
|
|
52
|
+
if (contentHeight > availableBelow && availableAbove > availableBelow) {
|
|
38
53
|
nextPlacement = 'up';
|
|
39
54
|
}
|
|
40
55
|
}
|
|
@@ -45,17 +60,18 @@ export default function useDropdownPosition(open, options = {}) {
|
|
|
45
60
|
lockedPlacementRef.current = nextPlacement;
|
|
46
61
|
}
|
|
47
62
|
const availableSpace = nextPlacement === 'up' ? availableAbove : availableBelow;
|
|
48
|
-
if (availableSpace > 0 &&
|
|
63
|
+
if (availableSpace > 0 && contentHeight > availableSpace) {
|
|
49
64
|
maxHeight = Math.max(140, availableSpace);
|
|
50
65
|
}
|
|
66
|
+
const height = maxHeight ? Math.min(contentHeight, maxHeight) : contentHeight;
|
|
51
67
|
setCurrentPlacement(nextPlacement);
|
|
52
68
|
if (strategy === 'fixed' && anchorRef?.current) {
|
|
53
69
|
const anchor = anchorRef.current.getBoundingClientRect();
|
|
54
70
|
let left = align === 'right' ? anchor.right - rect.width : anchor.left;
|
|
55
71
|
const maxLeft = window.innerWidth - padding - rect.width;
|
|
56
72
|
left = clamp(left, padding, Math.max(padding, maxLeft));
|
|
57
|
-
let top = nextPlacement === 'down' ? anchor.bottom + gap : anchor.top -
|
|
58
|
-
const maxTop = window.innerHeight - padding -
|
|
73
|
+
let top = nextPlacement === 'down' ? anchor.bottom + gap : anchor.top - height - gap;
|
|
74
|
+
const maxTop = window.innerHeight - padding - height;
|
|
59
75
|
top = clamp(top, padding, Math.max(padding, maxTop));
|
|
60
76
|
setStyle({
|
|
61
77
|
position: 'fixed',
|
|
@@ -77,7 +93,7 @@ export default function useDropdownPosition(open, options = {}) {
|
|
|
77
93
|
bottom: nextPlacement === 'up' ? `calc(100% + ${gap}px)` : 'auto',
|
|
78
94
|
transformOrigin: `${nextPlacement === 'up' ? 'bottom' : 'top'} ${align}`,
|
|
79
95
|
});
|
|
80
|
-
}, [gap, align, requestedPlacement, anchorRef, strategy]);
|
|
96
|
+
}, [gap, align, requestedPlacement, anchorRef, strategy, setStyle]);
|
|
81
97
|
useIsomorphicLayoutEffect(() => {
|
|
82
98
|
if (!open) {
|
|
83
99
|
lockedPlacementRef.current = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDropdownPosition.js","sourceRoot":"","sources":["../../src/hooks/useDropdownPosition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAgB1B,MAAM,yBAAyB,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;AAC1G,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAElC,MAAM,CAAC,OAAO,UAAU,mBAAmB,CAAC,IAAa,EAAE,UAAmB,EAAE;IAC9E,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,EAAE,SAAS,EAAE,kBAAkB,GAAG,MAAM,EAAE,SAAS,EAAE,QAAQ,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC;IACvH,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC/C,MAAM,kBAAkB,GAAG,KAAK,CAAC,MAAM,CAAuB,IAAI,CAAC,CAAC;IACpE,MAAM,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"useDropdownPosition.js","sourceRoot":"","sources":["../../src/hooks/useDropdownPosition.ts"],"names":[],"mappings":"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"}
|