@react-aria/overlays 3.23.4 → 3.25.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/dist/Overlay.main.js.map +1 -1
- package/dist/Overlay.module.js.map +1 -1
- package/dist/PortalProvider.main.js +1 -1
- package/dist/PortalProvider.main.js.map +1 -1
- package/dist/PortalProvider.mjs +1 -1
- package/dist/PortalProvider.module.js +1 -1
- package/dist/PortalProvider.module.js.map +1 -1
- package/dist/ariaHideOutside.main.js +2 -1
- package/dist/ariaHideOutside.main.js.map +1 -1
- package/dist/ariaHideOutside.mjs +2 -1
- package/dist/ariaHideOutside.module.js +2 -1
- package/dist/ariaHideOutside.module.js.map +1 -1
- package/dist/calculatePosition.main.js +32 -23
- package/dist/calculatePosition.main.js.map +1 -1
- package/dist/calculatePosition.mjs +32 -23
- package/dist/calculatePosition.module.js +32 -23
- package/dist/calculatePosition.module.js.map +1 -1
- package/dist/types.d.ts +5 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/useCloseOnScroll.main.js.map +1 -1
- package/dist/useCloseOnScroll.module.js.map +1 -1
- package/dist/useModal.main.js +1 -1
- package/dist/useModal.main.js.map +1 -1
- package/dist/useModal.mjs +1 -1
- package/dist/useModal.module.js +1 -1
- package/dist/useModal.module.js.map +1 -1
- package/dist/useModalOverlay.main.js +1 -1
- package/dist/useModalOverlay.main.js.map +1 -1
- package/dist/useModalOverlay.mjs +1 -1
- package/dist/useModalOverlay.module.js +1 -1
- package/dist/useModalOverlay.module.js.map +1 -1
- package/dist/useOverlay.main.js +2 -2
- package/dist/useOverlay.main.js.map +1 -1
- package/dist/useOverlay.mjs +2 -2
- package/dist/useOverlay.module.js +2 -2
- package/dist/useOverlay.module.js.map +1 -1
- package/dist/useOverlayPosition.main.js +18 -21
- package/dist/useOverlayPosition.main.js.map +1 -1
- package/dist/useOverlayPosition.mjs +18 -21
- package/dist/useOverlayPosition.module.js +18 -21
- package/dist/useOverlayPosition.module.js.map +1 -1
- package/dist/useOverlayTrigger.main.js +1 -1
- package/dist/useOverlayTrigger.main.js.map +1 -1
- package/dist/useOverlayTrigger.mjs +1 -1
- package/dist/useOverlayTrigger.module.js +1 -1
- package/dist/useOverlayTrigger.module.js.map +1 -1
- package/dist/usePopover.main.js +2 -1
- package/dist/usePopover.main.js.map +1 -1
- package/dist/usePopover.mjs +2 -1
- package/dist/usePopover.module.js +2 -1
- package/dist/usePopover.module.js.map +1 -1
- package/dist/usePreventScroll.main.js +13 -26
- package/dist/usePreventScroll.main.js.map +1 -1
- package/dist/usePreventScroll.mjs +13 -26
- package/dist/usePreventScroll.module.js +13 -26
- package/dist/usePreventScroll.module.js.map +1 -1
- package/package.json +14 -14
- package/src/Overlay.tsx +1 -1
- package/src/PortalProvider.tsx +1 -1
- package/src/ariaHideOutside.ts +10 -3
- package/src/calculatePosition.ts +27 -30
- package/src/useCloseOnScroll.ts +2 -2
- package/src/useModal.tsx +2 -2
- package/src/useModalOverlay.ts +1 -1
- package/src/useOverlay.ts +2 -2
- package/src/useOverlayPosition.ts +20 -23
- package/src/useOverlayTrigger.ts +2 -2
- package/src/usePopover.ts +3 -2
- package/src/usePreventScroll.ts +16 -32
package/src/useOverlayTrigger.ts
CHANGED
|
@@ -50,7 +50,7 @@ export function useOverlayTrigger(props: OverlayTriggerProps, state: OverlayTrig
|
|
|
50
50
|
// https://www.w3.org/TR/wai-aria-1.1/#aria-haspopup
|
|
51
51
|
// However, we only add it for menus for now because screen readers often
|
|
52
52
|
// announce it as a menu even for other values.
|
|
53
|
-
let ariaHasPopup = undefined;
|
|
53
|
+
let ariaHasPopup: undefined | boolean | 'listbox' = undefined;
|
|
54
54
|
if (type === 'menu') {
|
|
55
55
|
ariaHasPopup = true;
|
|
56
56
|
} else if (type === 'listbox') {
|
|
@@ -62,7 +62,7 @@ export function useOverlayTrigger(props: OverlayTriggerProps, state: OverlayTrig
|
|
|
62
62
|
triggerProps: {
|
|
63
63
|
'aria-haspopup': ariaHasPopup,
|
|
64
64
|
'aria-expanded': isOpen,
|
|
65
|
-
'aria-controls': isOpen ? overlayId :
|
|
65
|
+
'aria-controls': isOpen ? overlayId : undefined,
|
|
66
66
|
onPress: state.toggle
|
|
67
67
|
},
|
|
68
68
|
overlayProps: {
|
package/src/usePopover.ts
CHANGED
|
@@ -63,7 +63,7 @@ export interface PopoverAria {
|
|
|
63
63
|
/** Props to apply to the underlay element, if any. */
|
|
64
64
|
underlayProps: DOMAttributes,
|
|
65
65
|
/** Placement of the popover with respect to the trigger. */
|
|
66
|
-
placement: PlacementAxis
|
|
66
|
+
placement: PlacementAxis | null
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
/**
|
|
@@ -82,7 +82,8 @@ export function usePopover(props: AriaPopoverProps, state: OverlayTriggerState):
|
|
|
82
82
|
|
|
83
83
|
let {overlayProps, underlayProps} = useOverlay(
|
|
84
84
|
{
|
|
85
|
-
|
|
85
|
+
// If popover is in the top layer, it should not prevent other popovers from being dismissed.
|
|
86
|
+
isOpen: state.isOpen && !otherProps['data-react-aria-top-layer'],
|
|
86
87
|
onClose: state.close,
|
|
87
88
|
shouldCloseOnBlur: true,
|
|
88
89
|
isDismissable: !isNonModal,
|
package/src/usePreventScroll.ts
CHANGED
|
@@ -17,7 +17,6 @@ interface PreventScrollOptions {
|
|
|
17
17
|
isDisabled?: boolean
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
// @ts-ignore
|
|
21
20
|
const visualViewport = typeof document !== 'undefined' && window.visualViewport;
|
|
22
21
|
|
|
23
22
|
// HTML input types that do not cause the software keyboard to appear.
|
|
@@ -140,24 +139,7 @@ function preventScrollMobileSafari() {
|
|
|
140
139
|
}
|
|
141
140
|
};
|
|
142
141
|
|
|
143
|
-
let onTouchEnd = (
|
|
144
|
-
let target = e.target as HTMLElement;
|
|
145
|
-
|
|
146
|
-
// Apply this change if we're not already focused on the target element
|
|
147
|
-
if (willOpenKeyboard(target) && target !== document.activeElement) {
|
|
148
|
-
e.preventDefault();
|
|
149
|
-
setupStyles();
|
|
150
|
-
|
|
151
|
-
// Apply a transform to trick Safari into thinking the input is at the top of the page
|
|
152
|
-
// so it doesn't try to scroll it into view. When tapping on an input, this needs to
|
|
153
|
-
// be done before the "focus" event, so we have to focus the element ourselves.
|
|
154
|
-
target.style.transform = 'translateY(-2000px)';
|
|
155
|
-
target.focus();
|
|
156
|
-
requestAnimationFrame(() => {
|
|
157
|
-
target.style.transform = '';
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
|
|
142
|
+
let onTouchEnd = () => {
|
|
161
143
|
if (restoreScrollableStyles) {
|
|
162
144
|
restoreScrollableStyles();
|
|
163
145
|
}
|
|
@@ -168,10 +150,8 @@ function preventScrollMobileSafari() {
|
|
|
168
150
|
if (willOpenKeyboard(target)) {
|
|
169
151
|
setupStyles();
|
|
170
152
|
|
|
171
|
-
//
|
|
172
|
-
//
|
|
173
|
-
// software keyboard. In these cases, it seems applying the transform in the focus event
|
|
174
|
-
// is good enough, whereas when tapping an input, it must be done before the focus event. 🤷♂️
|
|
153
|
+
// Apply a transform to trick Safari into thinking the input is at the top of the page
|
|
154
|
+
// so it doesn't try to scroll it into view.
|
|
175
155
|
target.style.transform = 'translateY(-2000px)';
|
|
176
156
|
requestAnimationFrame(() => {
|
|
177
157
|
target.style.transform = '';
|
|
@@ -195,7 +175,7 @@ function preventScrollMobileSafari() {
|
|
|
195
175
|
}
|
|
196
176
|
};
|
|
197
177
|
|
|
198
|
-
let restoreStyles = null;
|
|
178
|
+
let restoreStyles: null | (() => void) = null;
|
|
199
179
|
let setupStyles = () => {
|
|
200
180
|
if (restoreStyles) {
|
|
201
181
|
return;
|
|
@@ -254,31 +234,35 @@ function setStyle(element: HTMLElement, style: string, value: string) {
|
|
|
254
234
|
|
|
255
235
|
// Adds an event listener to an element, and returns a function to remove it.
|
|
256
236
|
function addEvent<K extends keyof GlobalEventHandlersEventMap>(
|
|
257
|
-
target:
|
|
237
|
+
target: Document | Window,
|
|
258
238
|
event: K,
|
|
259
|
-
handler: (this: Document, ev: GlobalEventHandlersEventMap[K]) => any,
|
|
239
|
+
handler: (this: Document | Window, ev: GlobalEventHandlersEventMap[K]) => any,
|
|
260
240
|
options?: boolean | AddEventListenerOptions
|
|
261
241
|
) {
|
|
242
|
+
// internal function, so it's ok to ignore the difficult to fix type error
|
|
243
|
+
// @ts-ignore
|
|
262
244
|
target.addEventListener(event, handler, options);
|
|
263
245
|
return () => {
|
|
246
|
+
// @ts-ignore
|
|
264
247
|
target.removeEventListener(event, handler, options);
|
|
265
248
|
};
|
|
266
249
|
}
|
|
267
250
|
|
|
268
251
|
function scrollIntoView(target: Element) {
|
|
269
252
|
let root = document.scrollingElement || document.documentElement;
|
|
270
|
-
|
|
253
|
+
let nextTarget: Element | null = target;
|
|
254
|
+
while (nextTarget && nextTarget !== root) {
|
|
271
255
|
// Find the parent scrollable element and adjust the scroll position if the target is not already in view.
|
|
272
|
-
let scrollable = getScrollParent(
|
|
273
|
-
if (scrollable !== document.documentElement && scrollable !== document.body && scrollable !==
|
|
256
|
+
let scrollable = getScrollParent(nextTarget);
|
|
257
|
+
if (scrollable !== document.documentElement && scrollable !== document.body && scrollable !== nextTarget) {
|
|
274
258
|
let scrollableTop = scrollable.getBoundingClientRect().top;
|
|
275
|
-
let targetTop =
|
|
276
|
-
if (targetTop > scrollableTop +
|
|
259
|
+
let targetTop = nextTarget.getBoundingClientRect().top;
|
|
260
|
+
if (targetTop > scrollableTop + nextTarget.clientHeight) {
|
|
277
261
|
scrollable.scrollTop += targetTop - scrollableTop;
|
|
278
262
|
}
|
|
279
263
|
}
|
|
280
264
|
|
|
281
|
-
|
|
265
|
+
nextTarget = scrollable.parentElement;
|
|
282
266
|
}
|
|
283
267
|
}
|
|
284
268
|
|