@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.
Files changed (69) hide show
  1. package/dist/Overlay.main.js.map +1 -1
  2. package/dist/Overlay.module.js.map +1 -1
  3. package/dist/PortalProvider.main.js +1 -1
  4. package/dist/PortalProvider.main.js.map +1 -1
  5. package/dist/PortalProvider.mjs +1 -1
  6. package/dist/PortalProvider.module.js +1 -1
  7. package/dist/PortalProvider.module.js.map +1 -1
  8. package/dist/ariaHideOutside.main.js +2 -1
  9. package/dist/ariaHideOutside.main.js.map +1 -1
  10. package/dist/ariaHideOutside.mjs +2 -1
  11. package/dist/ariaHideOutside.module.js +2 -1
  12. package/dist/ariaHideOutside.module.js.map +1 -1
  13. package/dist/calculatePosition.main.js +32 -23
  14. package/dist/calculatePosition.main.js.map +1 -1
  15. package/dist/calculatePosition.mjs +32 -23
  16. package/dist/calculatePosition.module.js +32 -23
  17. package/dist/calculatePosition.module.js.map +1 -1
  18. package/dist/types.d.ts +5 -5
  19. package/dist/types.d.ts.map +1 -1
  20. package/dist/useCloseOnScroll.main.js.map +1 -1
  21. package/dist/useCloseOnScroll.module.js.map +1 -1
  22. package/dist/useModal.main.js +1 -1
  23. package/dist/useModal.main.js.map +1 -1
  24. package/dist/useModal.mjs +1 -1
  25. package/dist/useModal.module.js +1 -1
  26. package/dist/useModal.module.js.map +1 -1
  27. package/dist/useModalOverlay.main.js +1 -1
  28. package/dist/useModalOverlay.main.js.map +1 -1
  29. package/dist/useModalOverlay.mjs +1 -1
  30. package/dist/useModalOverlay.module.js +1 -1
  31. package/dist/useModalOverlay.module.js.map +1 -1
  32. package/dist/useOverlay.main.js +2 -2
  33. package/dist/useOverlay.main.js.map +1 -1
  34. package/dist/useOverlay.mjs +2 -2
  35. package/dist/useOverlay.module.js +2 -2
  36. package/dist/useOverlay.module.js.map +1 -1
  37. package/dist/useOverlayPosition.main.js +18 -21
  38. package/dist/useOverlayPosition.main.js.map +1 -1
  39. package/dist/useOverlayPosition.mjs +18 -21
  40. package/dist/useOverlayPosition.module.js +18 -21
  41. package/dist/useOverlayPosition.module.js.map +1 -1
  42. package/dist/useOverlayTrigger.main.js +1 -1
  43. package/dist/useOverlayTrigger.main.js.map +1 -1
  44. package/dist/useOverlayTrigger.mjs +1 -1
  45. package/dist/useOverlayTrigger.module.js +1 -1
  46. package/dist/useOverlayTrigger.module.js.map +1 -1
  47. package/dist/usePopover.main.js +2 -1
  48. package/dist/usePopover.main.js.map +1 -1
  49. package/dist/usePopover.mjs +2 -1
  50. package/dist/usePopover.module.js +2 -1
  51. package/dist/usePopover.module.js.map +1 -1
  52. package/dist/usePreventScroll.main.js +13 -26
  53. package/dist/usePreventScroll.main.js.map +1 -1
  54. package/dist/usePreventScroll.mjs +13 -26
  55. package/dist/usePreventScroll.module.js +13 -26
  56. package/dist/usePreventScroll.module.js.map +1 -1
  57. package/package.json +14 -14
  58. package/src/Overlay.tsx +1 -1
  59. package/src/PortalProvider.tsx +1 -1
  60. package/src/ariaHideOutside.ts +10 -3
  61. package/src/calculatePosition.ts +27 -30
  62. package/src/useCloseOnScroll.ts +2 -2
  63. package/src/useModal.tsx +2 -2
  64. package/src/useModalOverlay.ts +1 -1
  65. package/src/useOverlay.ts +2 -2
  66. package/src/useOverlayPosition.ts +20 -23
  67. package/src/useOverlayTrigger.ts +2 -2
  68. package/src/usePopover.ts +3 -2
  69. package/src/usePreventScroll.ts +16 -32
@@ -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 : null,
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
- isOpen: state.isOpen,
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,
@@ -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 = (e: TouchEvent) => {
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
- // Transform also needs to be applied in the focus event in cases where focus moves
172
- // other than tapping on an input directly, e.g. the next/previous buttons in the
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: EventTarget,
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
- while (target && target !== root) {
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(target);
273
- if (scrollable !== document.documentElement && scrollable !== document.body && scrollable !== target) {
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 = target.getBoundingClientRect().top;
276
- if (targetTop > scrollableTop + target.clientHeight) {
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
- target = scrollable.parentElement;
265
+ nextTarget = scrollable.parentElement;
282
266
  }
283
267
  }
284
268