@fluentui/react-positioning 0.0.0-nightlya372ad979820211103.1 → 0.0.0-nightlya54302c0b220211124.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +45 -10
- package/CHANGELOG.md +18 -7
- package/dist/react-positioning.d.ts +28 -0
- package/lib/createArrowStyles.d.ts +27 -0
- package/lib/createArrowStyles.js +75 -0
- package/lib/createArrowStyles.js.map +1 -0
- package/lib/createVirtualElementFromClick.js +9 -9
- package/lib/createVirtualElementFromClick.js.map +1 -1
- package/lib/index.d.ts +2 -1
- package/lib/index.js +2 -1
- package/lib/index.js.map +1 -1
- package/lib/usePopper.js +64 -71
- package/lib/usePopper.js.map +1 -1
- package/lib/usePopperMouseTarget.js +5 -5
- package/lib/usePopperMouseTarget.js.map +1 -1
- package/lib/utils/getBoundary.js +1 -1
- package/lib/utils/getReactFiberFromNode.d.ts +0 -1
- package/lib/utils/getReactFiberFromNode.js +1 -1
- package/lib/utils/getReactFiberFromNode.js.map +1 -1
- package/lib/utils/getScrollParent.js +6 -6
- package/lib/utils/getScrollParent.js.map +1 -1
- package/lib/utils/mergeArrowOffset.js +5 -5
- package/lib/utils/mergeArrowOffset.js.map +1 -1
- package/lib/utils/positioningHelper.d.ts +1 -1
- package/lib/utils/positioningHelper.js +14 -14
- package/lib/utils/positioningHelper.js.map +1 -1
- package/lib/utils/resolvePositioningShorthand.js +1 -1
- package/lib/utils/resolvePositioningShorthand.js.map +1 -1
- package/lib/utils/useCallbackRef.js +6 -6
- package/lib/utils/useCallbackRef.js.map +1 -1
- package/lib-commonjs/createArrowStyles.d.ts +27 -0
- package/lib-commonjs/createArrowStyles.js +79 -0
- package/lib-commonjs/createArrowStyles.js.map +1 -0
- package/lib-commonjs/createVirtualElementFromClick.js +9 -9
- package/lib-commonjs/createVirtualElementFromClick.js.map +1 -1
- package/lib-commonjs/index.d.ts +2 -1
- package/lib-commonjs/index.js +3 -2
- package/lib-commonjs/index.js.map +1 -1
- package/lib-commonjs/usePopper.js +69 -76
- package/lib-commonjs/usePopper.js.map +1 -1
- package/lib-commonjs/usePopperMouseTarget.js +7 -7
- package/lib-commonjs/usePopperMouseTarget.js.map +1 -1
- package/lib-commonjs/utils/getBoundary.js +2 -2
- package/lib-commonjs/utils/getBoundary.js.map +1 -1
- package/lib-commonjs/utils/getReactFiberFromNode.d.ts +0 -1
- package/lib-commonjs/utils/getReactFiberFromNode.js +1 -1
- package/lib-commonjs/utils/getReactFiberFromNode.js.map +1 -1
- package/lib-commonjs/utils/getScrollParent.js +6 -6
- package/lib-commonjs/utils/getScrollParent.js.map +1 -1
- package/lib-commonjs/utils/index.js +1 -1
- package/lib-commonjs/utils/mergeArrowOffset.js +5 -5
- package/lib-commonjs/utils/mergeArrowOffset.js.map +1 -1
- package/lib-commonjs/utils/positioningHelper.d.ts +1 -1
- package/lib-commonjs/utils/positioningHelper.js +14 -14
- package/lib-commonjs/utils/positioningHelper.js.map +1 -1
- package/lib-commonjs/utils/resolvePositioningShorthand.js +1 -1
- package/lib-commonjs/utils/resolvePositioningShorthand.js.map +1 -1
- package/lib-commonjs/utils/useCallbackRef.js +8 -8
- package/lib-commonjs/utils/useCallbackRef.js.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.json
CHANGED
@@ -2,28 +2,63 @@
|
|
2
2
|
"name": "@fluentui/react-positioning",
|
3
3
|
"entries": [
|
4
4
|
{
|
5
|
-
"date": "Wed,
|
6
|
-
"tag": "@fluentui/react-positioning_v0.0.0-
|
7
|
-
"version": "0.0.0-
|
5
|
+
"date": "Wed, 24 Nov 2021 04:12:45 GMT",
|
6
|
+
"tag": "@fluentui/react-positioning_v0.0.0-nightlya54302c0b220211124.1",
|
7
|
+
"version": "0.0.0-nightlya54302c0b220211124.1",
|
8
8
|
"comments": {
|
9
9
|
"prerelease": [
|
10
10
|
{
|
11
|
-
"author": "
|
11
|
+
"author": "lingfangao@hotmail.com",
|
12
|
+
"package": "@fluentui/react-positioning",
|
13
|
+
"commit": "58db204f28af1d68df7260ff580cf91f0adcfb66",
|
14
|
+
"comment": "Add utility function to create styles for an arrow element"
|
15
|
+
},
|
16
|
+
{
|
17
|
+
"author": "beachball",
|
18
|
+
"package": "@fluentui/react-positioning",
|
19
|
+
"comment": "Bump @fluentui/react-make-styles to v0.0.0-nightlya54302c0b220211124.1",
|
20
|
+
"commit": "e3c1bd15060ac276670338660c7965b877e333f4"
|
21
|
+
},
|
22
|
+
{
|
23
|
+
"author": "beachball",
|
24
|
+
"package": "@fluentui/react-positioning",
|
25
|
+
"comment": "Bump @fluentui/react-shared-contexts to v0.0.0-nightlya54302c0b220211124.1",
|
26
|
+
"commit": "e3c1bd15060ac276670338660c7965b877e333f4"
|
27
|
+
}
|
28
|
+
]
|
29
|
+
}
|
30
|
+
},
|
31
|
+
{
|
32
|
+
"date": "Fri, 12 Nov 2021 13:25:30 GMT",
|
33
|
+
"tag": "@fluentui/react-positioning_v9.0.0-beta.3",
|
34
|
+
"version": "9.0.0-beta.3",
|
35
|
+
"comments": {
|
36
|
+
"prerelease": [
|
37
|
+
{
|
38
|
+
"author": "gcox@microsoft.com",
|
12
39
|
"package": "@fluentui/react-positioning",
|
13
|
-
"commit": "
|
14
|
-
"comment": "
|
40
|
+
"commit": "c9bd5b5a02ae94a8239ce1b56cac2f0d0dbd3586",
|
41
|
+
"comment": "Updated beta and RC components to ES2019"
|
15
42
|
},
|
16
43
|
{
|
17
44
|
"author": "beachball",
|
18
45
|
"package": "@fluentui/react-positioning",
|
19
|
-
"comment": "Bump @fluentui/react-shared-contexts to
|
20
|
-
"commit": "
|
46
|
+
"comment": "Bump @fluentui/react-shared-contexts to v9.0.0-beta.3",
|
47
|
+
"commit": "742342e52c65066f779232e4e1302fedf0dd460d"
|
21
48
|
},
|
22
49
|
{
|
23
50
|
"author": "beachball",
|
24
51
|
"package": "@fluentui/react-positioning",
|
25
|
-
"comment": "Bump @fluentui/react-utilities to
|
26
|
-
"commit": "
|
52
|
+
"comment": "Bump @fluentui/react-utilities to v9.0.0-beta.3",
|
53
|
+
"commit": "742342e52c65066f779232e4e1302fedf0dd460d"
|
54
|
+
}
|
55
|
+
],
|
56
|
+
"none": [
|
57
|
+
{
|
58
|
+
"author": "lingfangao@hotmail.com",
|
59
|
+
"package": "@fluentui/react-positioning",
|
60
|
+
"commit": "00f70581480b536e723fb69edf0ae617beac4807",
|
61
|
+
"comment": "Remove beta release tag"
|
27
62
|
}
|
28
63
|
]
|
29
64
|
}
|
package/CHANGELOG.md
CHANGED
@@ -1,19 +1,30 @@
|
|
1
1
|
# Change Log - @fluentui/react-positioning
|
2
2
|
|
3
|
-
This log was last generated on Wed,
|
3
|
+
This log was last generated on Wed, 24 Nov 2021 04:12:45 GMT and should not be manually modified.
|
4
4
|
|
5
5
|
<!-- Start content -->
|
6
6
|
|
7
|
-
## [0.0.0-
|
7
|
+
## [0.0.0-nightlya54302c0b220211124.1](https://github.com/microsoft/fluentui/tree/@fluentui/react-positioning_v0.0.0-nightlya54302c0b220211124.1)
|
8
8
|
|
9
|
-
Wed,
|
10
|
-
[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-positioning_v9.0.0-beta.
|
9
|
+
Wed, 24 Nov 2021 04:12:45 GMT
|
10
|
+
[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-positioning_v9.0.0-beta.3..@fluentui/react-positioning_v0.0.0-nightlya54302c0b220211124.1)
|
11
11
|
|
12
12
|
### Changes
|
13
13
|
|
14
|
-
-
|
15
|
-
- Bump @fluentui/react-
|
16
|
-
- Bump @fluentui/react-
|
14
|
+
- Add utility function to create styles for an arrow element ([PR #20541](https://github.com/microsoft/fluentui/pull/20541) by lingfangao@hotmail.com)
|
15
|
+
- Bump @fluentui/react-make-styles to v0.0.0-nightlya54302c0b220211124.1 ([commit](https://github.com/microsoft/fluentui/commit/e3c1bd15060ac276670338660c7965b877e333f4) by beachball)
|
16
|
+
- Bump @fluentui/react-shared-contexts to v0.0.0-nightlya54302c0b220211124.1 ([commit](https://github.com/microsoft/fluentui/commit/e3c1bd15060ac276670338660c7965b877e333f4) by beachball)
|
17
|
+
|
18
|
+
## [9.0.0-beta.3](https://github.com/microsoft/fluentui/tree/@fluentui/react-positioning_v9.0.0-beta.3)
|
19
|
+
|
20
|
+
Fri, 12 Nov 2021 13:25:30 GMT
|
21
|
+
[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-positioning_v9.0.0-beta.2..@fluentui/react-positioning_v9.0.0-beta.3)
|
22
|
+
|
23
|
+
### Changes
|
24
|
+
|
25
|
+
- Updated beta and RC components to ES2019 ([PR #20405](https://github.com/microsoft/fluentui/pull/20405) by gcox@microsoft.com)
|
26
|
+
- Bump @fluentui/react-shared-contexts to v9.0.0-beta.3 ([PR #20583](https://github.com/microsoft/fluentui/pull/20583) by beachball)
|
27
|
+
- Bump @fluentui/react-utilities to v9.0.0-beta.3 ([PR #20583](https://github.com/microsoft/fluentui/pull/20583) by beachball)
|
17
28
|
|
18
29
|
## [9.0.0-beta.2](https://github.com/microsoft/fluentui/tree/@fluentui/react-positioning_v9.0.0-beta.2)
|
19
30
|
|
@@ -1,5 +1,7 @@
|
|
1
|
+
import type { MakeStylesStyleRule } from '@fluentui/make-styles';
|
1
2
|
import * as PopperJs from '@popperjs/core';
|
2
3
|
import * as React_2 from 'react';
|
4
|
+
import type { Theme } from '@fluentui/react-theme';
|
3
5
|
|
4
6
|
export declare type Alignment = 'top' | 'bottom' | 'start' | 'end' | 'center';
|
5
7
|
|
@@ -7,6 +9,32 @@ export declare type AutoSize = 'height' | 'height-always' | 'width' | 'width-alw
|
|
7
9
|
|
8
10
|
export declare type Boundary = PopperJs.Boundary | 'scrollParent' | 'window';
|
9
11
|
|
12
|
+
/**
|
13
|
+
* Helper that creates a makeStyles rule for an arrow element.
|
14
|
+
* For runtime arrow size toggling simply create extra classnames to apply to the arrow element
|
15
|
+
*
|
16
|
+
* ```ts
|
17
|
+
* makeStyles({
|
18
|
+
* arrowWithSize: createArrowStyles(5),
|
19
|
+
*
|
20
|
+
* arrowWithoutSize: createArrowStyles(),
|
21
|
+
* mediumArrow: { aspectRatio: 1, width: '4px' }
|
22
|
+
* smallArrow: { aspectRatio: 1, width: '2px' }
|
23
|
+
* })
|
24
|
+
* ...
|
25
|
+
*
|
26
|
+
* state.arrowWithSize.clasName = styles.arrowWithSize
|
27
|
+
* state.arrowWithoutSize.className = mergeClases(
|
28
|
+
* styles.arrowWithoutSize,
|
29
|
+
* state.smallArrow && styles.smallArrow,
|
30
|
+
* state.mediumArrow && styles.mediumArrow,
|
31
|
+
* )
|
32
|
+
* ```
|
33
|
+
*
|
34
|
+
* @param size - dimensions of the square arrow element in pixels.
|
35
|
+
*/
|
36
|
+
export declare function createArrowStyles(size?: number): MakeStylesStyleRule<Theme>;
|
37
|
+
|
10
38
|
/**
|
11
39
|
* Creates a virtual element based on the position of a click event
|
12
40
|
* Can be used as a target for popper in scenarios such as context menus
|
@@ -0,0 +1,27 @@
|
|
1
|
+
import type { MakeStylesStyleRule } from '@fluentui/make-styles';
|
2
|
+
import type { Theme } from '@fluentui/react-theme';
|
3
|
+
/**
|
4
|
+
* Helper that creates a makeStyles rule for an arrow element.
|
5
|
+
* For runtime arrow size toggling simply create extra classnames to apply to the arrow element
|
6
|
+
*
|
7
|
+
* ```ts
|
8
|
+
* makeStyles({
|
9
|
+
* arrowWithSize: createArrowStyles(5),
|
10
|
+
*
|
11
|
+
* arrowWithoutSize: createArrowStyles(),
|
12
|
+
* mediumArrow: { aspectRatio: 1, width: '4px' }
|
13
|
+
* smallArrow: { aspectRatio: 1, width: '2px' }
|
14
|
+
* })
|
15
|
+
* ...
|
16
|
+
*
|
17
|
+
* state.arrowWithSize.clasName = styles.arrowWithSize
|
18
|
+
* state.arrowWithoutSize.className = mergeClases(
|
19
|
+
* styles.arrowWithoutSize,
|
20
|
+
* state.smallArrow && styles.smallArrow,
|
21
|
+
* state.mediumArrow && styles.mediumArrow,
|
22
|
+
* )
|
23
|
+
* ```
|
24
|
+
*
|
25
|
+
* @param size - dimensions of the square arrow element in pixels.
|
26
|
+
*/
|
27
|
+
export declare function createArrowStyles(size?: number): MakeStylesStyleRule<Theme>;
|
@@ -0,0 +1,75 @@
|
|
1
|
+
/**
|
2
|
+
* Helper that creates a makeStyles rule for an arrow element.
|
3
|
+
* For runtime arrow size toggling simply create extra classnames to apply to the arrow element
|
4
|
+
*
|
5
|
+
* ```ts
|
6
|
+
* makeStyles({
|
7
|
+
* arrowWithSize: createArrowStyles(5),
|
8
|
+
*
|
9
|
+
* arrowWithoutSize: createArrowStyles(),
|
10
|
+
* mediumArrow: { aspectRatio: 1, width: '4px' }
|
11
|
+
* smallArrow: { aspectRatio: 1, width: '2px' }
|
12
|
+
* })
|
13
|
+
* ...
|
14
|
+
*
|
15
|
+
* state.arrowWithSize.clasName = styles.arrowWithSize
|
16
|
+
* state.arrowWithoutSize.className = mergeClases(
|
17
|
+
* styles.arrowWithoutSize,
|
18
|
+
* state.smallArrow && styles.smallArrow,
|
19
|
+
* state.mediumArrow && styles.mediumArrow,
|
20
|
+
* )
|
21
|
+
* ```
|
22
|
+
*
|
23
|
+
* @param size - dimensions of the square arrow element in pixels.
|
24
|
+
*/
|
25
|
+
export function createArrowStyles(size) {
|
26
|
+
return theme => {
|
27
|
+
const arrowHCBorderStyle = `1px solid transparent`;
|
28
|
+
const arrowHCBorder = {
|
29
|
+
borderRight: arrowHCBorderStyle,
|
30
|
+
borderBottom: arrowHCBorderStyle,
|
31
|
+
};
|
32
|
+
return {
|
33
|
+
position: 'absolute',
|
34
|
+
background: 'inherit',
|
35
|
+
visibility: 'hidden',
|
36
|
+
zIndex: -1,
|
37
|
+
...(size && {
|
38
|
+
aspectRatio: 1,
|
39
|
+
width: `${size}px`,
|
40
|
+
}),
|
41
|
+
':before': {
|
42
|
+
content: '""',
|
43
|
+
borderRadius: '4px',
|
44
|
+
position: 'absolute',
|
45
|
+
width: 'inherit',
|
46
|
+
height: 'inherit',
|
47
|
+
background: 'inherit',
|
48
|
+
visibility: 'visible',
|
49
|
+
borderBottomRightRadius: theme.borderRadiusSmall,
|
50
|
+
transform: 'rotate(var(--angle)) translate(0, 50%) rotate(45deg)',
|
51
|
+
},
|
52
|
+
':global([data-popper-placement])': {
|
53
|
+
':before': arrowHCBorder,
|
54
|
+
},
|
55
|
+
// Popper sets data-popper-placement on the root element, which is used to align the arrow
|
56
|
+
':global([data-popper-placement^="top"])': {
|
57
|
+
bottom: 0,
|
58
|
+
'--angle': '0',
|
59
|
+
},
|
60
|
+
':global([data-popper-placement^="right"])': {
|
61
|
+
left: 0,
|
62
|
+
'--angle': '90deg',
|
63
|
+
},
|
64
|
+
':global([data-popper-placement^="bottom"])': {
|
65
|
+
top: 0,
|
66
|
+
'--angle': '180deg',
|
67
|
+
},
|
68
|
+
':global([data-popper-placement^="left"])': {
|
69
|
+
right: 0,
|
70
|
+
'--angle': '270deg',
|
71
|
+
},
|
72
|
+
};
|
73
|
+
};
|
74
|
+
}
|
75
|
+
//# sourceMappingURL=createArrowStyles.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"createArrowStyles.js","sourceRoot":"","sources":["../src/createArrowStyles.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,OAAO,KAAK,CAAC,EAAE;QACb,MAAM,kBAAkB,GAAG,uBAAuB,CAAC;QACnD,MAAM,aAAa,GAAG;YACpB,WAAW,EAAE,kBAAkB;YAC/B,YAAY,EAAE,kBAAkB;SACjC,CAAC;QAEF,OAAO;YACL,QAAQ,EAAE,UAAU;YACpB,UAAU,EAAE,SAAS;YACrB,UAAU,EAAE,QAAQ;YACpB,MAAM,EAAE,CAAC,CAAC;YAEV,GAAG,CAAC,IAAI,IAAI;gBACV,WAAW,EAAE,CAAC;gBACd,KAAK,EAAE,GAAG,IAAI,IAAI;aACnB,CAAC;YAEF,SAAS,EAAE;gBACT,OAAO,EAAE,IAAI;gBACb,YAAY,EAAE,KAAK;gBACnB,QAAQ,EAAE,UAAU;gBACpB,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,SAAS;gBACrB,UAAU,EAAE,SAAS;gBACrB,uBAAuB,EAAE,KAAK,CAAC,iBAAiB;gBAChD,SAAS,EAAE,sDAAsD;aAClE;YAED,kCAAkC,EAAE;gBAClC,SAAS,EAAE,aAAa;aACzB;YAED,0FAA0F;YAC1F,yCAAyC,EAAE;gBACzC,MAAM,EAAE,CAAC;gBACT,SAAS,EAAE,GAAG;aACf;YAED,2CAA2C,EAAE;gBAC3C,IAAI,EAAE,CAAC;gBACP,SAAS,EAAE,OAAO;aACnB;YACD,4CAA4C,EAAE;gBAC5C,GAAG,EAAE,CAAC;gBACN,SAAS,EAAE,QAAQ;aACpB;YACD,0CAA0C,EAAE;gBAC1C,KAAK,EAAE,CAAC;gBACR,SAAS,EAAE,QAAQ;aACpB;SACF,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
@@ -3,22 +3,22 @@
|
|
3
3
|
* Can be used as a target for popper in scenarios such as context menus
|
4
4
|
*/
|
5
5
|
export function createVirtualElementFromClick(nativeEvent) {
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
const left = nativeEvent.clientX;
|
7
|
+
const top = nativeEvent.clientY;
|
8
|
+
const right = left + 1;
|
9
|
+
const bottom = top + 1;
|
10
10
|
function getBoundingClientRect() {
|
11
11
|
return {
|
12
|
-
left
|
13
|
-
top
|
14
|
-
right
|
15
|
-
bottom
|
12
|
+
left,
|
13
|
+
top,
|
14
|
+
right,
|
15
|
+
bottom,
|
16
16
|
height: 1,
|
17
17
|
width: 1,
|
18
18
|
};
|
19
19
|
}
|
20
20
|
return {
|
21
|
-
getBoundingClientRect
|
21
|
+
getBoundingClientRect,
|
22
22
|
};
|
23
23
|
}
|
24
24
|
//# sourceMappingURL=createVirtualElementFromClick.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"createVirtualElementFromClick.js","sourceRoot":"","sources":["../src/createVirtualElementFromClick.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,6BAA6B,CAAC,WAAuB;IACnE,
|
1
|
+
{"version":3,"file":"createVirtualElementFromClick.js","sourceRoot":"","sources":["../src/createVirtualElementFromClick.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,6BAA6B,CAAC,WAAuB;IACnE,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC;IACjC,MAAM,GAAG,GAAG,WAAW,CAAC,OAAO,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC;IACvB,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC;IAEvB,SAAS,qBAAqB;QAC5B,OAAO;YACL,IAAI;YACJ,GAAG;YACH,KAAK;YACL,MAAM;YAEN,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,CAAC;SACT,CAAC;IACJ,CAAC;IAED,OAAO;QACL,qBAAqB;KACtB,CAAC;AACJ,CAAC"}
|
package/lib/index.d.ts
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
export * from './usePopper';
|
2
1
|
export * from './createVirtualElementFromClick';
|
2
|
+
export * from './createArrowStyles';
|
3
|
+
export * from './usePopper';
|
3
4
|
export * from './usePopperMouseTarget';
|
4
5
|
export { resolvePositioningShorthand, mergeArrowOffset } from './utils/index';
|
5
6
|
export * from './types';
|
package/lib/index.js
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
export * from './usePopper';
|
2
1
|
export * from './createVirtualElementFromClick';
|
2
|
+
export * from './createArrowStyles';
|
3
|
+
export * from './usePopper';
|
3
4
|
export * from './usePopperMouseTarget';
|
4
5
|
export { resolvePositioningShorthand, mergeArrowOffset } from './utils/index';
|
5
6
|
export * from './types';
|
package/lib/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC9E,cAAc,SAAS,CAAC"}
|
package/lib/usePopper.js
CHANGED
@@ -13,7 +13,7 @@ import * as React from 'react';
|
|
13
13
|
function hasAutofocusProp(node) {
|
14
14
|
var _a;
|
15
15
|
// https://github.com/facebook/react/blob/848bb2426e44606e0a55dfe44c7b3ece33772485/packages/react-dom/src/client/ReactDOMHostConfig.js#L157-L166
|
16
|
-
|
16
|
+
const isAutoFocusableElement = node.nodeName === 'BUTTON' ||
|
17
17
|
node.nodeName === 'INPUT' ||
|
18
18
|
node.nodeName === 'SELECT' ||
|
19
19
|
node.nodeName === 'TEXTAREA';
|
@@ -33,33 +33,30 @@ function hasAutofocusFilter(node) {
|
|
33
33
|
* that can't be resolved properly during an initial rendering.
|
34
34
|
*/
|
35
35
|
function usePopperOptions(options, popperOriginalPositionRef) {
|
36
|
-
|
36
|
+
const { arrowPadding, autoSize, coverTarget, flipBoundary, offset, onStateUpdate, overflowBoundary,
|
37
37
|
// eslint-disable-next-line @typescript-eslint/naming-convention
|
38
|
-
unstable_disableTether
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
var state = _a.state;
|
38
|
+
unstable_disableTether, pinned, } = options;
|
39
|
+
const isRtl = useFluent().dir === 'rtl';
|
40
|
+
const placement = getPlacement(options.align, options.position, isRtl);
|
41
|
+
const strategy = options.positionFixed ? 'fixed' : 'absolute';
|
42
|
+
const handleStateUpdate = useEventCallback(({ state }) => {
|
44
43
|
if (onStateUpdate) {
|
45
44
|
onStateUpdate(state);
|
46
45
|
}
|
47
46
|
});
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
}, [offset, isRtl]);
|
56
|
-
return React.useCallback(function (target, container, arrow) {
|
47
|
+
const offsetModifier = React.useMemo(() => offset
|
48
|
+
? {
|
49
|
+
name: 'offset',
|
50
|
+
options: { offset: isRtl ? applyRtlToOffset(offset) : offset },
|
51
|
+
}
|
52
|
+
: null, [offset, isRtl]);
|
53
|
+
return React.useCallback((target, container, arrow) => {
|
57
54
|
var _a;
|
58
|
-
|
59
|
-
|
55
|
+
const scrollParentElement = getScrollParent(container);
|
56
|
+
const hasScrollableElement = scrollParentElement
|
60
57
|
? scrollParentElement !== ((_a = scrollParentElement.ownerDocument) === null || _a === void 0 ? void 0 : _a.body)
|
61
58
|
: false;
|
62
|
-
|
59
|
+
const modifiers = [
|
63
60
|
/**
|
64
61
|
* We are setting the position to `fixed` in the first effect to prevent scroll jumps in case of the content
|
65
62
|
* with managed focus. Modifier sets the position to `fixed` before all other modifier effects. Another part of
|
@@ -69,15 +66,14 @@ function usePopperOptions(options, popperOriginalPositionRef) {
|
|
69
66
|
name: 'positionStyleFix',
|
70
67
|
enabled: true,
|
71
68
|
phase: 'afterWrite',
|
72
|
-
effect:
|
73
|
-
var state = _a.state, instance = _a.instance;
|
69
|
+
effect: ({ state, instance }) => {
|
74
70
|
// ".isFirstRun" is a part of our patch, on a first evaluation it will "undefined"
|
75
71
|
// should be disabled for subsequent runs as it breaks positioning for them
|
76
72
|
if (instance.isFirstRun !== false) {
|
77
73
|
popperOriginalPositionRef.current = state.elements.popper.style.position;
|
78
74
|
state.elements.popper.style.position = 'fixed';
|
79
75
|
}
|
80
|
-
return
|
76
|
+
return () => undefined;
|
81
77
|
},
|
82
78
|
requires: [],
|
83
79
|
},
|
@@ -139,25 +135,24 @@ function usePopperOptions(options, popperOriginalPositionRef) {
|
|
139
135
|
altBoundary: true,
|
140
136
|
boundary: getBoundary(container, overflowBoundary),
|
141
137
|
},
|
142
|
-
fn:
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
var applyMaxWidth = autoSize === 'always' ||
|
138
|
+
fn({ state, options: modifierOptions }) {
|
139
|
+
const overflow = PopperJs.detectOverflow(state, modifierOptions);
|
140
|
+
const { x, y } = state.modifiersData.preventOverflow || { x: 0, y: 0 };
|
141
|
+
const { width, height } = state.rects.popper;
|
142
|
+
const basePlacement = getBasePlacement(state.placement);
|
143
|
+
const widthProp = basePlacement === 'left' ? 'left' : 'right';
|
144
|
+
const heightProp = basePlacement === 'top' ? 'top' : 'bottom';
|
145
|
+
const applyMaxWidth = autoSize === 'always' ||
|
151
146
|
autoSize === 'width-always' ||
|
152
147
|
(overflow[widthProp] > 0 && (autoSize === true || autoSize === 'width'));
|
153
|
-
|
148
|
+
const applyMaxHeight = autoSize === 'always' ||
|
154
149
|
autoSize === 'height-always' ||
|
155
150
|
(overflow[heightProp] > 0 && (autoSize === true || autoSize === 'height'));
|
156
151
|
if (applyMaxWidth) {
|
157
|
-
state.styles.popper.maxWidth = width - overflow[widthProp] - x
|
152
|
+
state.styles.popper.maxWidth = `${width - overflow[widthProp] - x}px`;
|
158
153
|
}
|
159
154
|
if (applyMaxHeight) {
|
160
|
-
state.styles.popper.maxHeight = height - overflow[heightProp] - y
|
155
|
+
state.styles.popper.maxHeight = `${height - overflow[heightProp] - y}px`;
|
161
156
|
}
|
162
157
|
},
|
163
158
|
},
|
@@ -178,9 +173,8 @@ function usePopperOptions(options, popperOriginalPositionRef) {
|
|
178
173
|
enabled: !!coverTarget,
|
179
174
|
phase: 'main',
|
180
175
|
requiresIfExists: ['offset', 'preventOverflow', 'flip'],
|
181
|
-
fn
|
182
|
-
|
183
|
-
var basePlacement = getBasePlacement(state.placement);
|
176
|
+
fn({ state }) {
|
177
|
+
const basePlacement = getBasePlacement(state.placement);
|
184
178
|
switch (basePlacement) {
|
185
179
|
case 'bottom':
|
186
180
|
state.modifiersData.popperOffsets.y -= state.rects.reference.height;
|
@@ -198,11 +192,11 @@ function usePopperOptions(options, popperOriginalPositionRef) {
|
|
198
192
|
},
|
199
193
|
},
|
200
194
|
].filter(Boolean); // filter boolean conditional spreading values
|
201
|
-
|
202
|
-
modifiers
|
203
|
-
placement
|
204
|
-
strategy
|
205
|
-
onFirstUpdate:
|
195
|
+
const popperOptions = {
|
196
|
+
modifiers,
|
197
|
+
placement,
|
198
|
+
strategy,
|
199
|
+
onFirstUpdate: state => handleStateUpdate({ state }),
|
206
200
|
};
|
207
201
|
return popperOptions;
|
208
202
|
}, [
|
@@ -229,19 +223,18 @@ function usePopperOptions(options, popperOriginalPositionRef) {
|
|
229
223
|
* - contains a specific to React fix related to initial positioning when containers have components with managed focus
|
230
224
|
* to avoid focus jumps
|
231
225
|
*/
|
232
|
-
export function usePopper(options) {
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
var handlePopperUpdate = useEventCallback(function () {
|
226
|
+
export function usePopper(options = {}) {
|
227
|
+
const { enabled = true } = options;
|
228
|
+
const isFirstMount = useFirstMount();
|
229
|
+
const popperOriginalPositionRef = React.useRef('absolute');
|
230
|
+
const resolvePopperOptions = usePopperOptions(options, popperOriginalPositionRef);
|
231
|
+
const popperInstanceRef = React.useRef(null);
|
232
|
+
const handlePopperUpdate = useEventCallback(() => {
|
240
233
|
var _a;
|
241
234
|
(_a = popperInstanceRef.current) === null || _a === void 0 ? void 0 : _a.destroy();
|
242
235
|
popperInstanceRef.current = null;
|
243
|
-
|
244
|
-
|
236
|
+
const { target = targetRef.current } = options;
|
237
|
+
let popperInstance = null;
|
245
238
|
if (canUseDOM() && enabled) {
|
246
239
|
if (target && containerRef.current) {
|
247
240
|
popperInstance = PopperJs.createPopper(target, containerRef.current, resolvePopperOptions(target, containerRef.current, arrowRef.current));
|
@@ -252,14 +245,14 @@ export function usePopper(options) {
|
|
252
245
|
* The patch updates `.forceUpdate()` Popper function which restores the original position before the first
|
253
246
|
* forceUpdate() call. See also "positionStyleFix" modifier in usePopperOptions().
|
254
247
|
*/
|
255
|
-
|
248
|
+
const originalForceUpdate = popperInstance.forceUpdate;
|
256
249
|
popperInstance.isFirstRun = true;
|
257
|
-
popperInstance.forceUpdate =
|
250
|
+
popperInstance.forceUpdate = () => {
|
258
251
|
if (popperInstance === null || popperInstance === void 0 ? void 0 : popperInstance.isFirstRun) {
|
259
252
|
popperInstance.state.elements.popper.style.position = popperOriginalPositionRef.current;
|
260
253
|
popperInstance.isFirstRun = false;
|
261
254
|
}
|
262
|
-
|
255
|
+
originalForceUpdate();
|
263
256
|
};
|
264
257
|
}
|
265
258
|
popperInstanceRef.current = popperInstance;
|
@@ -284,24 +277,24 @@ export function usePopper(options) {
|
|
284
277
|
//
|
285
278
|
// This again can be solved with callback refs. It's not a huge issue as with hooks we are moving popper's creation
|
286
279
|
// to ChatMessage itself, however, without `useCallback()` refs it's still a Pandora box.
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
React.useImperativeHandle(options.popperRef,
|
291
|
-
updatePosition:
|
280
|
+
const targetRef = useCallbackRef(null, handlePopperUpdate, true);
|
281
|
+
const containerRef = useCallbackRef(null, handlePopperUpdate, true);
|
282
|
+
const arrowRef = useCallbackRef(null, handlePopperUpdate, true);
|
283
|
+
React.useImperativeHandle(options.popperRef, () => ({
|
284
|
+
updatePosition: () => {
|
292
285
|
var _a;
|
293
286
|
(_a = popperInstanceRef.current) === null || _a === void 0 ? void 0 : _a.update();
|
294
287
|
},
|
295
|
-
})
|
296
|
-
useIsomorphicLayoutEffect(
|
288
|
+
}), []);
|
289
|
+
useIsomorphicLayoutEffect(() => {
|
297
290
|
handlePopperUpdate();
|
298
|
-
return
|
291
|
+
return () => {
|
299
292
|
var _a;
|
300
293
|
(_a = popperInstanceRef.current) === null || _a === void 0 ? void 0 : _a.destroy();
|
301
294
|
popperInstanceRef.current = null;
|
302
295
|
};
|
303
296
|
}, [handlePopperUpdate, options.enabled, options.target]);
|
304
|
-
useIsomorphicLayoutEffect(
|
297
|
+
useIsomorphicLayoutEffect(() => {
|
305
298
|
var _a;
|
306
299
|
if (!isFirstMount) {
|
307
300
|
(_a = popperInstanceRef.current) === null || _a === void 0 ? void 0 : _a.setOptions(resolvePopperOptions(options.target || targetRef.current, containerRef.current, arrowRef.current));
|
@@ -316,15 +309,15 @@ export function usePopper(options) {
|
|
316
309
|
if (process.env.NODE_ENV !== 'production') {
|
317
310
|
// This checked should run only in development mode
|
318
311
|
// eslint-disable-next-line react-hooks/rules-of-hooks
|
319
|
-
React.useEffect(
|
312
|
+
React.useEffect(() => {
|
320
313
|
var _a;
|
321
314
|
if (containerRef.current) {
|
322
|
-
|
323
|
-
|
315
|
+
const contentNode = containerRef.current;
|
316
|
+
const treeWalker = (_a = contentNode.ownerDocument) === null || _a === void 0 ? void 0 : _a.createTreeWalker(contentNode, NodeFilter.SHOW_ELEMENT, {
|
324
317
|
acceptNode: hasAutofocusFilter,
|
325
318
|
});
|
326
319
|
while (treeWalker === null || treeWalker === void 0 ? void 0 : treeWalker.nextNode()) {
|
327
|
-
|
320
|
+
const node = treeWalker.currentNode;
|
328
321
|
// eslint-disable-next-line no-console
|
329
322
|
console.warn('<Popper>:', node);
|
330
323
|
// eslint-disable-next-line no-console
|
@@ -338,7 +331,7 @@ export function usePopper(options) {
|
|
338
331
|
'(React.useEffect(), componentDidMount(), etc.) and we can not prevent this behavior. If you really',
|
339
332
|
'want to use "autoFocus" please add "position: fixed" to styles of the element that is wrapped by',
|
340
333
|
'"Popper".',
|
341
|
-
|
334
|
+
`In general, it's not recommended to use "autoFocus" as it may break accessibility aspects:`,
|
342
335
|
'https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/no-autofocus.md',
|
343
336
|
'\n',
|
344
337
|
'We suggest to use the "trapFocus" prop on Fluent components or a catch "ref" and then use',
|
@@ -352,6 +345,6 @@ export function usePopper(options) {
|
|
352
345
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
353
346
|
}, []);
|
354
347
|
}
|
355
|
-
return { targetRef
|
348
|
+
return { targetRef, containerRef, arrowRef };
|
356
349
|
}
|
357
350
|
//# sourceMappingURL=usePopper.js.map
|