@fluentui/react-positioning 9.0.0-alpha.9 → 9.0.0-beta.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. package/CHANGELOG.json +1279 -1
  2. package/CHANGELOG.md +577 -2
  3. package/dist/react-positioning.d.ts +95 -27
  4. package/lib/createArrowStyles.d.ts +27 -0
  5. package/lib/createArrowStyles.js +75 -0
  6. package/lib/createArrowStyles.js.map +1 -0
  7. package/lib/createVirtualElementFromClick.d.ts +6 -0
  8. package/lib/createVirtualElementFromClick.js +26 -0
  9. package/lib/createVirtualElementFromClick.js.map +1 -0
  10. package/lib/index.d.ts +4 -0
  11. package/lib/index.js +5 -0
  12. package/lib/index.js.map +1 -1
  13. package/lib/tsdoc-metadata.json +1 -1
  14. package/lib/types.d.ts +19 -29
  15. package/lib/types.js +1 -0
  16. package/lib/types.js.map +1 -1
  17. package/lib/usePopper.d.ts +21 -1
  18. package/lib/usePopper.js +364 -284
  19. package/lib/usePopper.js.map +1 -1
  20. package/lib/usePopperMouseTarget.d.ts +11 -0
  21. package/lib/usePopperMouseTarget.js +40 -0
  22. package/lib/usePopperMouseTarget.js.map +1 -0
  23. package/lib/utils/getBasePlacement.d.ts +8 -0
  24. package/lib/utils/getBasePlacement.js +10 -0
  25. package/lib/utils/getBasePlacement.js.map +1 -0
  26. package/lib/utils/getBoundary.d.ts +1 -1
  27. package/lib/utils/getBoundary.js +15 -11
  28. package/lib/utils/getBoundary.js.map +1 -1
  29. package/lib/utils/getReactFiberFromNode.d.ts +0 -1
  30. package/lib/utils/getReactFiberFromNode.js +39 -35
  31. package/lib/utils/getReactFiberFromNode.js.map +1 -1
  32. package/lib/utils/getScrollParent.js +46 -32
  33. package/lib/utils/getScrollParent.js.map +1 -1
  34. package/lib/utils/index.d.ts +5 -3
  35. package/lib/utils/index.js +5 -3
  36. package/lib/utils/index.js.map +1 -1
  37. package/lib/utils/mergeArrowOffset.d.ts +10 -0
  38. package/lib/utils/mergeArrowOffset.js +42 -0
  39. package/lib/utils/mergeArrowOffset.js.map +1 -0
  40. package/lib/utils/positioningHelper.d.ts +3 -3
  41. package/lib/utils/positioningHelper.js +42 -34
  42. package/lib/utils/positioningHelper.js.map +1 -1
  43. package/lib/utils/resolvePositioningShorthand.d.ts +2 -0
  44. package/lib/utils/resolvePositioningShorthand.js +63 -0
  45. package/lib/utils/resolvePositioningShorthand.js.map +1 -0
  46. package/lib/utils/useCallbackRef.js +35 -29
  47. package/lib/utils/useCallbackRef.js.map +1 -1
  48. package/lib-commonjs/createArrowStyles.d.ts +27 -0
  49. package/lib-commonjs/createArrowStyles.js +84 -0
  50. package/lib-commonjs/createArrowStyles.js.map +1 -0
  51. package/lib-commonjs/createVirtualElementFromClick.d.ts +6 -0
  52. package/lib-commonjs/createVirtualElementFromClick.js +35 -0
  53. package/lib-commonjs/createVirtualElementFromClick.js.map +1 -0
  54. package/lib-commonjs/index.d.ts +4 -0
  55. package/lib-commonjs/index.js +31 -2
  56. package/lib-commonjs/index.js.map +1 -1
  57. package/lib-commonjs/types.d.ts +19 -29
  58. package/lib-commonjs/types.js +4 -1
  59. package/lib-commonjs/types.js.map +1 -1
  60. package/lib-commonjs/usePopper.d.ts +21 -1
  61. package/lib-commonjs/usePopper.js +378 -287
  62. package/lib-commonjs/usePopper.js.map +1 -1
  63. package/lib-commonjs/usePopperMouseTarget.d.ts +11 -0
  64. package/lib-commonjs/usePopperMouseTarget.js +51 -0
  65. package/lib-commonjs/usePopperMouseTarget.js.map +1 -0
  66. package/lib-commonjs/utils/getBasePlacement.d.ts +8 -0
  67. package/lib-commonjs/utils/getBasePlacement.js +19 -0
  68. package/lib-commonjs/utils/getBasePlacement.js.map +1 -0
  69. package/lib-commonjs/utils/getBoundary.d.ts +1 -1
  70. package/lib-commonjs/utils/getBoundary.js +24 -13
  71. package/lib-commonjs/utils/getBoundary.js.map +1 -1
  72. package/lib-commonjs/utils/getReactFiberFromNode.d.ts +0 -1
  73. package/lib-commonjs/utils/getReactFiberFromNode.js +45 -36
  74. package/lib-commonjs/utils/getReactFiberFromNode.js.map +1 -1
  75. package/lib-commonjs/utils/getScrollParent.js +56 -33
  76. package/lib-commonjs/utils/getScrollParent.js.map +1 -1
  77. package/lib-commonjs/utils/index.d.ts +5 -3
  78. package/lib-commonjs/utils/index.js +19 -5
  79. package/lib-commonjs/utils/index.js.map +1 -1
  80. package/lib-commonjs/utils/mergeArrowOffset.d.ts +10 -0
  81. package/lib-commonjs/utils/mergeArrowOffset.js +51 -0
  82. package/lib-commonjs/utils/mergeArrowOffset.js.map +1 -0
  83. package/lib-commonjs/utils/positioningHelper.d.ts +3 -3
  84. package/lib-commonjs/utils/positioningHelper.js +53 -35
  85. package/lib-commonjs/utils/positioningHelper.js.map +1 -1
  86. package/lib-commonjs/utils/resolvePositioningShorthand.d.ts +2 -0
  87. package/lib-commonjs/utils/resolvePositioningShorthand.js +72 -0
  88. package/lib-commonjs/utils/resolvePositioningShorthand.js.map +1 -0
  89. package/lib-commonjs/utils/useCallbackRef.js +46 -32
  90. package/lib-commonjs/utils/useCallbackRef.js.map +1 -1
  91. package/package.json +13 -10
  92. package/config/api-extractor.json +0 -3
  93. package/etc/react-positioning.api.md +0 -70
  94. package/just.config.ts +0 -3
  95. package/lib/utils/isBrowser.d.ts +0 -1
  96. package/lib/utils/isBrowser.js +0 -4
  97. package/lib/utils/isBrowser.js.map +0 -1
  98. package/lib-amd/index.d.ts +0 -2
  99. package/lib-amd/index.js +0 -6
  100. package/lib-amd/index.js.map +0 -1
  101. package/lib-amd/types.d.ts +0 -78
  102. package/lib-amd/types.js +0 -5
  103. package/lib-amd/types.js.map +0 -1
  104. package/lib-amd/usePopper.d.ts +0 -15
  105. package/lib-amd/usePopper.js +0 -281
  106. package/lib-amd/usePopper.js.map +0 -1
  107. package/lib-amd/utils/getBoundary.d.ts +0 -6
  108. package/lib-amd/utils/getBoundary.js +0 -23
  109. package/lib-amd/utils/getBoundary.js.map +0 -1
  110. package/lib-amd/utils/getReactFiberFromNode.d.ts +0 -109
  111. package/lib-amd/utils/getReactFiberFromNode.js +0 -47
  112. package/lib-amd/utils/getReactFiberFromNode.js.map +0 -1
  113. package/lib-amd/utils/getScrollParent.d.ts +0 -12
  114. package/lib-amd/utils/getScrollParent.js +0 -55
  115. package/lib-amd/utils/getScrollParent.js.map +0 -1
  116. package/lib-amd/utils/index.d.ts +0 -6
  117. package/lib-amd/utils/index.js +0 -11
  118. package/lib-amd/utils/index.js.map +0 -1
  119. package/lib-amd/utils/isBrowser.d.ts +0 -1
  120. package/lib-amd/utils/isBrowser.js +0 -8
  121. package/lib-amd/utils/isBrowser.js.map +0 -1
  122. package/lib-amd/utils/positioningHelper.d.ts +0 -7
  123. package/lib-amd/utils/positioningHelper.js +0 -45
  124. package/lib-amd/utils/positioningHelper.js.map +0 -1
  125. package/lib-amd/utils/useCallbackRef.d.ts +0 -19
  126. package/lib-amd/utils/useCallbackRef.js +0 -54
  127. package/lib-amd/utils/useCallbackRef.js.map +0 -1
  128. package/lib-commonjs/utils/isBrowser.d.ts +0 -1
  129. package/lib-commonjs/utils/isBrowser.js +0 -6
  130. package/lib-commonjs/utils/isBrowser.js.map +0 -1
@@ -1,10 +1,56 @@
1
+ import type { MakeStylesStyleRule } from '@fluentui/make-styles';
1
2
  import * as PopperJs from '@popperjs/core';
2
- import * as React from 'react';
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
 
8
+ export declare type AutoSize = 'height' | 'height-always' | 'width' | 'width-always' | 'always' | boolean;
9
+
6
10
  export declare type Boundary = PopperJs.Boundary | 'scrollParent' | 'window';
7
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
+
38
+ /**
39
+ * Creates a virtual element based on the position of a click event
40
+ * Can be used as a target for popper in scenarios such as context menus
41
+ */
42
+ export declare function createVirtualElementFromClick(nativeEvent: MouseEvent): PopperVirtualElement;
43
+
44
+ /**
45
+ * Generally when adding an arrow to popper, it's necessary to offset the position of the popper by the
46
+ * height of the arrow. A simple utility to merge a provided offset with an arrow height to return the final offset
47
+ *
48
+ * @param userOffset - The offset provided by the user
49
+ * @param arrowHeight - The height of the arrow in px
50
+ * @returns User offset augmented with arrow height
51
+ */
52
+ export declare function mergeArrowOffset(userOffset: Offset | undefined | null, arrowHeight: number): Offset;
53
+
8
54
  export declare type Offset = OffsetFunction | [number | null | undefined, number | null | undefined];
9
55
 
10
56
  export declare type OffsetFunction = (param: OffsetFunctionParam) => [number | null | undefined, number | null | undefined];
@@ -15,36 +61,42 @@ export declare type OffsetFunctionParam = {
15
61
  placement: PopperJs.Placement;
16
62
  };
17
63
 
18
- export declare interface PopperOptions extends PositioningProps {
64
+ declare interface PopperOptions extends PositioningProps {
19
65
  /**
20
66
  * If false, delays Popper's creation.
21
67
  * @default true
22
68
  */
23
69
  enabled?: boolean;
70
+ onStateUpdate?: (state: Partial<PopperJs.State>) => void;
24
71
  /**
25
- * Array of conditions to be met in order to trigger a subsequent render to reposition the elements.
72
+ * Enables the Popper box to position itself in 'fixed' mode (default value is position: 'absolute')
73
+ * @default false
26
74
  */
27
- positioningDependencies?: React.DependencyList;
28
- onStateUpdate?: (state: Partial<PopperJs.State>) => void;
75
+ positionFixed?: boolean;
76
+ /**
77
+ * When the reference element or the viewport is outside viewport allows a popper element to be fully in viewport.
78
+ * "all" enables this behavior for all axis.
79
+ */
80
+ unstable_disableTether?: boolean | 'all';
29
81
  }
30
82
 
31
83
  export declare type PopperRefHandle = {
32
84
  updatePosition: () => void;
33
85
  };
34
86
 
87
+ export declare type PopperVirtualElement = PopperJs.VirtualElement;
88
+
35
89
  export declare type Position = 'above' | 'below' | 'before' | 'after';
36
90
 
37
91
  export declare interface PositioningProps {
38
- /**
39
- * Alignment for the component.
40
- */
92
+ /** Alignment for the component. Only has an effect if used with the @see position option */
41
93
  align?: Alignment;
42
94
  /** The element which will define the boundaries of the popper position for the flip behavior. */
43
95
  flipBoundary?: Boundary;
44
96
  /** The element which will define the boundaries of the popper position for the overflow behavior. */
45
97
  overflowBoundary?: Boundary;
46
98
  /** An imperative handle to Popper methods. */
47
- containerRef?: React.Ref<PopperRefHandle>;
99
+ popperRef?: React_2.Ref<PopperRefHandle>;
48
100
  /**
49
101
  * Position for the component. Position has higher priority than align. If position is vertical ('above' | 'below')
50
102
  * and align is also vertical ('top' | 'bottom') or if both position and align are horizontal ('before' | 'after'
@@ -52,11 +104,6 @@ export declare interface PositioningProps {
52
104
  * then provided value for 'align' will be ignored and 'center' will be used instead.
53
105
  */
54
106
  position?: Position;
55
- /**
56
- * Enables the Popper box to position itself in 'fixed' mode (default value is position: 'absolute')
57
- * @default false
58
- */
59
- positionFixed?: boolean;
60
107
  /**
61
108
  * Lets you displace a popper element from its reference element.
62
109
  * This can be useful if you need to apply some margin between them or if you need to fine tune the
@@ -69,23 +116,34 @@ export declare interface PositioningProps {
69
116
  */
70
117
  arrowPadding?: number;
71
118
  /**
72
- * When the reference element or the viewport is outside viewport allows a popper element to be fully in viewport.
73
- * "all" enables this behavior for all axis.
119
+ * Applies max-height and max-width on popper to fit it within the available space in viewport.
120
+ * true enables this for both width and height when overflow happens.
121
+ * 'always' applies `max-height`/`max-width` regardless of overflow.
122
+ * 'height' applies `max-height` when overflow happens, and 'width' for `max-width`
123
+ * `height-always` applies `max-height` regardless of overflow, and 'width-always' for always applying `max-width`
74
124
  */
75
- unstable_disableTether?: boolean | 'all';
125
+ autoSize?: AutoSize;
76
126
  /**
77
- * Disables automatic repositioning of the component; it will always be placed according to the values of `align` and
78
- * `position` props, regardless of the size of the component, the reference element or the viewport.
127
+ * Manual override for popper target. Useful for scenarios where a component accepts user prop to override target
79
128
  */
80
- unstable_pinned?: boolean;
129
+ target?: HTMLElement | PopperVirtualElement | null;
81
130
  /**
82
- * Applies max-height and max-width on popper to fit it within the available space in viewport.
83
- * true enables this for both width and height.
84
- * 'height' applies only `max-height` and 'width' for `max-width`
131
+ * Modifies position and alignment to cover the target
132
+ */
133
+ coverTarget?: boolean;
134
+ /**
135
+ * Disables automatic repositioning of the component; it will always be placed according to the values of `align` and
136
+ * `position` props, regardless of the size of the component, the reference element or the viewport.
85
137
  */
86
- autoSize?: 'height' | 'width' | boolean;
138
+ pinned?: boolean;
87
139
  }
88
140
 
141
+ export declare type PositioningShorthand = PositioningProps | PositioningShorthandValue;
142
+
143
+ export declare type PositioningShorthandValue = 'above' | 'above-start' | 'above-end' | 'below' | 'below-start' | 'below-end' | 'before' | 'before-top' | 'before-bottom' | 'after' | 'after-top' | 'after-bottom';
144
+
145
+ export declare function resolvePositioningShorthand(shorthand: PositioningShorthand | undefined | null): Readonly<PositioningProps>;
146
+
89
147
  /**
90
148
  * Exposes Popper positioning API via React hook. Contains few important differences between an official "react-popper"
91
149
  * package:
@@ -95,9 +153,19 @@ export declare interface PositioningProps {
95
153
  * to avoid focus jumps
96
154
  */
97
155
  export declare function usePopper(options?: PopperOptions): {
98
- targetRef: React.MutableRefObject<any>;
99
- containerRef: React.MutableRefObject<any>;
100
- arrowRef: React.MutableRefObject<any>;
156
+ targetRef: React_2.MutableRefObject<any>;
157
+ containerRef: React_2.MutableRefObject<any>;
158
+ arrowRef: React_2.MutableRefObject<any>;
101
159
  };
102
160
 
161
+ /**
162
+ * A state hook that manages a popper virtual element from mouseevents.
163
+ * Useful for scenarios where a component needs to be positioned by mouse click (e.g. contextmenu)
164
+ * React synthetic events are not persisted by this hook
165
+ *
166
+ * @param initialState - initializes a user provided state similare to useState
167
+ * @returns state and dispatcher for a Popper virtual element that uses native/synthetic mouse events
168
+ */
169
+ export declare const usePopperMouseTarget: (initialState?: PopperJs.VirtualElement | (() => PopperJs.VirtualElement) | undefined) => readonly [PopperJs.VirtualElement | undefined, (event: React_2.MouseEvent | MouseEvent | undefined | null) => void];
170
+
103
171
  export { }
@@ -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,"sources":["../src/createArrowStyles.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;AAuBG;AACH,OAAM,SAAU,iBAAV,CAA4B,IAA5B,EAAyC;AAC7C,SAAO,KAAK,IAAG;AACb,UAAM,kBAAkB,GAAG,uBAA3B;AACA,UAAM,aAAa,GAAG;AACpB,MAAA,WAAW,EAAE,kBADO;AAEpB,MAAA,YAAY,EAAE;AAFM,KAAtB;AAKA,WAAO;AACL,MAAA,QAAQ,EAAE,UADL;AAEL,MAAA,UAAU,EAAE,SAFP;AAGL,MAAA,UAAU,EAAE,QAHP;AAIL,MAAA,MAAM,EAAE,CAAC,CAJJ;AAML,UAAI,IAAI,IAAI;AACV,QAAA,WAAW,EAAE,CADH;AAEV,QAAA,KAAK,EAAE,GAAG,IAAI;AAFJ,OAAZ,CANK;AAWL,iBAAW;AACT,QAAA,OAAO,EAAE,IADA;AAET,QAAA,YAAY,EAAE,KAFL;AAGT,QAAA,QAAQ,EAAE,UAHD;AAIT,QAAA,KAAK,EAAE,SAJE;AAKT,QAAA,MAAM,EAAE,SALC;AAMT,QAAA,UAAU,EAAE,SANH;AAOT,QAAA,UAAU,EAAE,SAPH;AAQT,QAAA,uBAAuB,EAAE,KAAK,CAAC,iBARtB;AAST,QAAA,SAAS,EAAE;AATF,OAXN;AAuBL,0CAAoC;AAClC,mBAAW;AADuB,OAvB/B;AA2BL;AACA,iDAA2C;AACzC,QAAA,MAAM,EAAE,CADiC;AAEzC,mBAAW;AAF8B,OA5BtC;AAiCL,mDAA6C;AAC3C,QAAA,IAAI,EAAE,CADqC;AAE3C,mBAAW;AAFgC,OAjCxC;AAqCL,oDAA8C;AAC5C,QAAA,GAAG,EAAE,CADuC;AAE5C,mBAAW;AAFiC,OArCzC;AAyCL,kDAA4C;AAC1C,QAAA,KAAK,EAAE,CADmC;AAE1C,mBAAW;AAF+B;AAzCvC,KAAP;AA8CD,GArDD;AAsDD","sourceRoot":""}
@@ -0,0 +1,6 @@
1
+ import type { PopperVirtualElement } from './types';
2
+ /**
3
+ * Creates a virtual element based on the position of a click event
4
+ * Can be used as a target for popper in scenarios such as context menus
5
+ */
6
+ export declare function createVirtualElementFromClick(nativeEvent: MouseEvent): PopperVirtualElement;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Creates a virtual element based on the position of a click event
3
+ * Can be used as a target for popper in scenarios such as context menus
4
+ */
5
+ export function createVirtualElementFromClick(nativeEvent) {
6
+ const left = nativeEvent.clientX;
7
+ const top = nativeEvent.clientY;
8
+ const right = left + 1;
9
+ const bottom = top + 1;
10
+
11
+ function getBoundingClientRect() {
12
+ return {
13
+ left,
14
+ top,
15
+ right,
16
+ bottom,
17
+ height: 1,
18
+ width: 1
19
+ };
20
+ }
21
+
22
+ return {
23
+ getBoundingClientRect
24
+ };
25
+ }
26
+ //# sourceMappingURL=createVirtualElementFromClick.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/createVirtualElementFromClick.ts"],"names":[],"mappings":"AAEA;;;AAGG;AACH,OAAM,SAAU,6BAAV,CAAwC,WAAxC,EAA+D;AACnE,QAAM,IAAI,GAAG,WAAW,CAAC,OAAzB;AACA,QAAM,GAAG,GAAG,WAAW,CAAC,OAAxB;AACA,QAAM,KAAK,GAAG,IAAI,GAAG,CAArB;AACA,QAAM,MAAM,GAAG,GAAG,GAAG,CAArB;;AAEA,WAAS,qBAAT,GAA8B;AAC5B,WAAO;AACL,MAAA,IADK;AAEL,MAAA,GAFK;AAGL,MAAA,KAHK;AAIL,MAAA,MAJK;AAML,MAAA,MAAM,EAAE,CANH;AAOL,MAAA,KAAK,EAAE;AAPF,KAAP;AASD;;AAED,SAAO;AACL,IAAA;AADK,GAAP;AAGD","sourceRoot":""}
package/lib/index.d.ts CHANGED
@@ -1,2 +1,6 @@
1
+ export * from './createVirtualElementFromClick';
2
+ export * from './createArrowStyles';
1
3
  export * from './usePopper';
4
+ export * from './usePopperMouseTarget';
5
+ export { resolvePositioningShorthand, mergeArrowOffset } from './utils/index';
2
6
  export * from './types';
package/lib/index.js CHANGED
@@ -1,2 +1,7 @@
1
+ export * from './createVirtualElementFromClick';
2
+ export * from './createArrowStyles';
1
3
  export * from './usePopper';
4
+ export * from './usePopperMouseTarget';
5
+ export { resolvePositioningShorthand, mergeArrowOffset } from './utils/index';
6
+ export * from './types';
2
7
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../src/","sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC","sourcesContent":["export * from './usePopper';\nexport * from './types';\n"]}
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"}
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.7.1"
8
+ "packageVersion": "7.18.1"
9
9
  }
10
10
  ]
11
11
  }
package/lib/types.d.ts CHANGED
@@ -9,21 +9,21 @@ export declare type OffsetFunction = (param: OffsetFunctionParam) => [number | n
9
9
  export declare type Offset = OffsetFunction | [number | null | undefined, number | null | undefined];
10
10
  export declare type Position = 'above' | 'below' | 'before' | 'after';
11
11
  export declare type Alignment = 'top' | 'bottom' | 'start' | 'end' | 'center';
12
+ export declare type AutoSize = 'height' | 'height-always' | 'width' | 'width-always' | 'always' | boolean;
12
13
  export declare type Boundary = PopperJs.Boundary | 'scrollParent' | 'window';
13
14
  export declare type PopperRefHandle = {
14
15
  updatePosition: () => void;
15
16
  };
17
+ export declare type PopperVirtualElement = PopperJs.VirtualElement;
16
18
  export interface PositioningProps {
17
- /**
18
- * Alignment for the component.
19
- */
19
+ /** Alignment for the component. Only has an effect if used with the @see position option */
20
20
  align?: Alignment;
21
21
  /** The element which will define the boundaries of the popper position for the flip behavior. */
22
22
  flipBoundary?: Boundary;
23
23
  /** The element which will define the boundaries of the popper position for the overflow behavior. */
24
24
  overflowBoundary?: Boundary;
25
25
  /** An imperative handle to Popper methods. */
26
- containerRef?: React.Ref<PopperRefHandle>;
26
+ popperRef?: React.Ref<PopperRefHandle>;
27
27
  /**
28
28
  * Position for the component. Position has higher priority than align. If position is vertical ('above' | 'below')
29
29
  * and align is also vertical ('top' | 'bottom') or if both position and align are horizontal ('before' | 'after'
@@ -31,11 +31,6 @@ export interface PositioningProps {
31
31
  * then provided value for 'align' will be ignored and 'center' will be used instead.
32
32
  */
33
33
  position?: Position;
34
- /**
35
- * Enables the Popper box to position itself in 'fixed' mode (default value is position: 'absolute')
36
- * @default false
37
- */
38
- positionFixed?: boolean;
39
34
  /**
40
35
  * Lets you displace a popper element from its reference element.
41
36
  * This can be useful if you need to apply some margin between them or if you need to fine tune the
@@ -48,31 +43,26 @@ export interface PositioningProps {
48
43
  */
49
44
  arrowPadding?: number;
50
45
  /**
51
- * When the reference element or the viewport is outside viewport allows a popper element to be fully in viewport.
52
- * "all" enables this behavior for all axis.
53
- */
54
- unstable_disableTether?: boolean | 'all';
55
- /**
56
- * Disables automatic repositioning of the component; it will always be placed according to the values of `align` and
57
- * `position` props, regardless of the size of the component, the reference element or the viewport.
46
+ * Applies max-height and max-width on popper to fit it within the available space in viewport.
47
+ * true enables this for both width and height when overflow happens.
48
+ * 'always' applies `max-height`/`max-width` regardless of overflow.
49
+ * 'height' applies `max-height` when overflow happens, and 'width' for `max-width`
50
+ * `height-always` applies `max-height` regardless of overflow, and 'width-always' for always applying `max-width`
58
51
  */
59
- unstable_pinned?: boolean;
52
+ autoSize?: AutoSize;
60
53
  /**
61
- * Applies max-height and max-width on popper to fit it within the available space in viewport.
62
- * true enables this for both width and height.
63
- * 'height' applies only `max-height` and 'width' for `max-width`
54
+ * Manual override for popper target. Useful for scenarios where a component accepts user prop to override target
64
55
  */
65
- autoSize?: 'height' | 'width' | boolean;
66
- }
67
- export interface PopperOptions extends PositioningProps {
56
+ target?: HTMLElement | PopperVirtualElement | null;
68
57
  /**
69
- * If false, delays Popper's creation.
70
- * @default true
58
+ * Modifies position and alignment to cover the target
71
59
  */
72
- enabled?: boolean;
60
+ coverTarget?: boolean;
73
61
  /**
74
- * Array of conditions to be met in order to trigger a subsequent render to reposition the elements.
62
+ * Disables automatic repositioning of the component; it will always be placed according to the values of `align` and
63
+ * `position` props, regardless of the size of the component, the reference element or the viewport.
75
64
  */
76
- positioningDependencies?: React.DependencyList;
77
- onStateUpdate?: (state: Partial<PopperJs.State>) => void;
65
+ pinned?: boolean;
78
66
  }
67
+ export declare type PositioningShorthandValue = 'above' | 'above-start' | 'above-end' | 'below' | 'below-start' | 'below-end' | 'before' | 'before-top' | 'before-bottom' | 'after' | 'after-top' | 'after-bottom';
68
+ export declare type PositioningShorthand = PositioningProps | PositioningShorthandValue;
package/lib/types.js CHANGED
@@ -1 +1,2 @@
1
+ export {};
1
2
  //# sourceMappingURL=types.js.map
package/lib/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"../src/","sources":["types.ts"],"names":[],"mappings":"","sourcesContent":["import * as PopperJs from '@popperjs/core';\nimport * as React from 'react';\n\nexport type OffsetFunctionParam = {\n popper: PopperJs.Rect;\n reference: PopperJs.Rect;\n placement: PopperJs.Placement;\n};\n\nexport type OffsetFunction = (param: OffsetFunctionParam) => [number | null | undefined, number | null | undefined];\n\nexport type Offset = OffsetFunction | [number | null | undefined, number | null | undefined];\n\nexport type Position = 'above' | 'below' | 'before' | 'after';\nexport type Alignment = 'top' | 'bottom' | 'start' | 'end' | 'center';\n\nexport type Boundary = PopperJs.Boundary | 'scrollParent' | 'window';\n\nexport type PopperRefHandle = { updatePosition: () => void };\n\nexport interface PositioningProps {\n /**\n * Alignment for the component.\n */\n align?: Alignment;\n\n /** The element which will define the boundaries of the popper position for the flip behavior. */\n flipBoundary?: Boundary;\n\n /** The element which will define the boundaries of the popper position for the overflow behavior. */\n overflowBoundary?: Boundary;\n\n /** An imperative handle to Popper methods. */\n containerRef?: React.Ref<PopperRefHandle>;\n\n /**\n * Position for the component. Position has higher priority than align. If position is vertical ('above' | 'below')\n * and align is also vertical ('top' | 'bottom') or if both position and align are horizontal ('before' | 'after'\n * and 'start' | 'end' respectively),\n * then provided value for 'align' will be ignored and 'center' will be used instead.\n */\n position?: Position;\n\n /**\n * Enables the Popper box to position itself in 'fixed' mode (default value is position: 'absolute')\n * @default false\n */\n positionFixed?: boolean;\n\n /**\n * Lets you displace a popper element from its reference element.\n * This can be useful if you need to apply some margin between them or if you need to fine tune the\n * position according to some custom logic.\n */\n offset?: Offset;\n\n /**\n * Defines padding between the corner of the popup element and the arrow.\n * Use to prevent the arrow from overlapping a rounded corner, for example.\n */\n arrowPadding?: number;\n\n /**\n * When the reference element or the viewport is outside viewport allows a popper element to be fully in viewport.\n * \"all\" enables this behavior for all axis.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n unstable_disableTether?: boolean | 'all';\n\n /**\n * Disables automatic repositioning of the component; it will always be placed according to the values of `align` and\n * `position` props, regardless of the size of the component, the reference element or the viewport.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n unstable_pinned?: boolean;\n\n /**\n * Applies max-height and max-width on popper to fit it within the available space in viewport.\n * true enables this for both width and height.\n * 'height' applies only `max-height` and 'width' for `max-width`\n */\n autoSize?: 'height' | 'width' | boolean;\n}\n\nexport interface PopperOptions extends PositioningProps {\n /**\n * If false, delays Popper's creation.\n * @default true\n */\n enabled?: boolean;\n\n /**\n * Array of conditions to be met in order to trigger a subsequent render to reposition the elements.\n */\n positioningDependencies?: React.DependencyList;\n\n onStateUpdate?: (state: Partial<PopperJs.State>) => void;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -1,5 +1,24 @@
1
+ import * as PopperJs from '@popperjs/core';
1
2
  import * as React from 'react';
2
- import { PopperOptions } from './types';
3
+ import type { PositioningProps } from './types';
4
+ interface PopperOptions extends PositioningProps {
5
+ /**
6
+ * If false, delays Popper's creation.
7
+ * @default true
8
+ */
9
+ enabled?: boolean;
10
+ onStateUpdate?: (state: Partial<PopperJs.State>) => void;
11
+ /**
12
+ * Enables the Popper box to position itself in 'fixed' mode (default value is position: 'absolute')
13
+ * @default false
14
+ */
15
+ positionFixed?: boolean;
16
+ /**
17
+ * When the reference element or the viewport is outside viewport allows a popper element to be fully in viewport.
18
+ * "all" enables this behavior for all axis.
19
+ */
20
+ unstable_disableTether?: boolean | 'all';
21
+ }
3
22
  /**
4
23
  * Exposes Popper positioning API via React hook. Contains few important differences between an official "react-popper"
5
24
  * package:
@@ -13,3 +32,4 @@ export declare function usePopper(options?: PopperOptions): {
13
32
  containerRef: React.MutableRefObject<any>;
14
33
  arrowRef: React.MutableRefObject<any>;
15
34
  };
35
+ export {};