@react-aria/overlays 3.12.1 → 3.13.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/main.js CHANGED
@@ -358,7 +358,7 @@ function $cd94b4896dd97759$export$d39e1813b3bdd0e1(props) {
358
358
  ];
359
359
  let updatePosition = (0, $6Zb2x$react.useCallback)(()=>{
360
360
  if (shouldUpdatePosition === false || !isOpen || !overlayRef.current || !targetRef.current || !scrollRef.current || !boundaryElement) return;
361
- setPosition((0, $5935ba4d7da2c103$export$b3ceb0cbf1056d98)({
361
+ let position = (0, $5935ba4d7da2c103$export$b3ceb0cbf1056d98)({
362
362
  placement: $cd94b4896dd97759$var$translateRTL(placement, direction),
363
363
  overlayNode: overlayRef.current,
364
364
  targetNode: targetRef.current,
@@ -369,7 +369,13 @@ function $cd94b4896dd97759$export$d39e1813b3bdd0e1(props) {
369
369
  offset: offset,
370
370
  crossOffset: crossOffset,
371
371
  maxHeight: maxHeight
372
- }));
372
+ });
373
+ // Modify overlay styles directly so positioning happens immediately without the need of a second render
374
+ // This is so we don't have to delay autoFocus scrolling or delay applying preventScroll for popovers
375
+ Object.keys(position.position).forEach((key)=>overlayRef.current.style[key] = position.position[key] + "px");
376
+ overlayRef.current.style.maxHeight = position.maxHeight != null ? position.maxHeight + "px" : undefined;
377
+ // Trigger a set state for a second render anyway for arrow positioning
378
+ setPosition(position);
373
379
  // eslint-disable-next-line react-hooks/exhaustive-deps
374
380
  }, deps);
375
381
  // Update position when anything changes
@@ -1171,20 +1177,35 @@ let $08ef1685902b6011$var$observerStack = [];
1171
1177
  function $08ef1685902b6011$export$1c3ebcada18427bf(targets, root = document.body) {
1172
1178
  let visibleNodes = new Set(targets);
1173
1179
  let hiddenNodes = new Set();
1174
- let walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {
1175
- acceptNode (node) {
1176
- // If this node is a live announcer, add it to the set of nodes to keep visible.
1177
- if ((node instanceof HTMLElement || node instanceof SVGElement) && node.dataset.liveAnnouncer === "true") visibleNodes.add(node);
1180
+ let walk = (root)=>{
1181
+ // Keep live announcer and top layer elements (e.g. toasts) visible.
1182
+ for (let element of root.querySelectorAll("[data-live-announcer], [data-react-aria-top-layer]"))visibleNodes.add(element);
1183
+ let acceptNode = (node)=>{
1178
1184
  // Skip this node and its children if it is one of the target nodes, or a live announcer.
1179
1185
  // Also skip children of already hidden nodes, as aria-hidden is recursive. An exception is
1180
1186
  // made for elements with role="row" since VoiceOver on iOS has issues hiding elements with role="row".
1181
1187
  // For that case we want to hide the cells inside as well (https://bugs.webkit.org/show_bug.cgi?id=222623).
1182
1188
  if (visibleNodes.has(node) || hiddenNodes.has(node.parentElement) && node.parentElement.getAttribute("role") !== "row") return NodeFilter.FILTER_REJECT;
1183
1189
  // Skip this node but continue to children if one of the targets is inside the node.
1184
- if (targets.some((target)=>node.contains(target))) return NodeFilter.FILTER_SKIP;
1190
+ for (let target of visibleNodes){
1191
+ if (node.contains(target)) return NodeFilter.FILTER_SKIP;
1192
+ }
1185
1193
  return NodeFilter.FILTER_ACCEPT;
1194
+ };
1195
+ let walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {
1196
+ acceptNode: acceptNode
1197
+ });
1198
+ // TreeWalker does not include the root.
1199
+ let acceptRoot = acceptNode(root);
1200
+ if (acceptRoot === NodeFilter.FILTER_ACCEPT) hide(root);
1201
+ if (acceptRoot !== NodeFilter.FILTER_REJECT) {
1202
+ let node = walker.nextNode();
1203
+ while(node != null){
1204
+ hide(node);
1205
+ node = walker.nextNode();
1206
+ }
1186
1207
  }
1187
- });
1208
+ };
1188
1209
  let hide = (node)=>{
1189
1210
  var _refCountMap_get;
1190
1211
  let refCount = (_refCountMap_get = $08ef1685902b6011$var$refCountMap.get(node)) !== null && _refCountMap_get !== void 0 ? _refCountMap_get : 0;
@@ -1198,11 +1219,7 @@ function $08ef1685902b6011$export$1c3ebcada18427bf(targets, root = document.body
1198
1219
  // If there is already a MutationObserver listening from a previous call,
1199
1220
  // disconnect it so the new on takes over.
1200
1221
  if ($08ef1685902b6011$var$observerStack.length) $08ef1685902b6011$var$observerStack[$08ef1685902b6011$var$observerStack.length - 1].disconnect();
1201
- let node = walker.nextNode();
1202
- while(node != null){
1203
- hide(node);
1204
- node = walker.nextNode();
1205
- }
1222
+ walk(root);
1206
1223
  let observer = new MutationObserver((changes)=>{
1207
1224
  for (let change of changes){
1208
1225
  if (change.type !== "childList" || change.addedNodes.length === 0) continue;
@@ -1211,9 +1228,15 @@ function $08ef1685902b6011$export$1c3ebcada18427bf(targets, root = document.body
1211
1228
  if (![
1212
1229
  ...visibleNodes,
1213
1230
  ...hiddenNodes
1214
- ].some((node)=>node.contains(change.target))) for (let node of change.addedNodes){
1215
- if ((node instanceof HTMLElement || node instanceof SVGElement) && node.dataset.liveAnnouncer === "true") visibleNodes.add(node);
1216
- else if (node instanceof Element) hide(node);
1231
+ ].some((node)=>node.contains(change.target))) {
1232
+ for (let node of change.removedNodes)if (node instanceof Element) {
1233
+ visibleNodes.delete(node);
1234
+ hiddenNodes.delete(node);
1235
+ }
1236
+ for (let node1 of change.addedNodes){
1237
+ if ((node1 instanceof HTMLElement || node1 instanceof SVGElement) && (node1.dataset.liveAnnouncer === "true" || node1.dataset.reactAriaTopLayer === "true")) visibleNodes.add(node1);
1238
+ else if (node1 instanceof Element) walk(node1);
1239
+ }
1217
1240
  }
1218
1241
  }
1219
1242
  });
@@ -1266,7 +1289,6 @@ function $08ef1685902b6011$export$1c3ebcada18427bf(targets, root = document.body
1266
1289
 
1267
1290
 
1268
1291
 
1269
-
1270
1292
  function $6c2dfcdee3e15e20$export$542a6fd13ac93354(props, state) {
1271
1293
  let { triggerRef: triggerRef , popoverRef: popoverRef , isNonModal: isNonModal , isKeyboardDismissDisabled: isKeyboardDismissDisabled , ...otherProps } = props;
1272
1294
  let { overlayProps: overlayProps , underlayProps: underlayProps } = (0, $82711f9cb668ecdb$export$ea8f71083e90600f)({
@@ -1283,18 +1305,8 @@ function $6c2dfcdee3e15e20$export$542a6fd13ac93354(props, state) {
1283
1305
  isOpen: state.isOpen,
1284
1306
  onClose: null
1285
1307
  });
1286
- // Delay preventing scroll until popover is positioned to avoid extra scroll padding.
1287
- // This requires a layout effect so that positioning has been committed to the DOM
1288
- // by the time usePreventScroll measures the element.
1289
- let [isPositioned, setPositioned] = (0, $6Zb2x$react.useState)(false);
1290
- (0, $6Zb2x$reactariautils.useLayoutEffect)(()=>{
1291
- if (!isNonModal && placement) setPositioned(true);
1292
- }, [
1293
- isNonModal,
1294
- placement
1295
- ]);
1296
1308
  (0, $5c2f5cd01815d369$export$ee0f7cc6afcd1c18)({
1297
- isDisabled: isNonModal || !isPositioned
1309
+ isDisabled: isNonModal
1298
1310
  });
1299
1311
  (0, $6Zb2x$reactariautils.useLayoutEffect)(()=>{
1300
1312
  if (state.isOpen && !isNonModal && popoverRef.current) return (0, $08ef1685902b6011$export$1c3ebcada18427bf)([