@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/module.js CHANGED
@@ -339,7 +339,7 @@ function $2a41e45df1593e64$export$d39e1813b3bdd0e1(props) {
339
339
  ];
340
340
  let updatePosition = (0, $k7QOs$useCallback)(()=>{
341
341
  if (shouldUpdatePosition === false || !isOpen || !overlayRef.current || !targetRef.current || !scrollRef.current || !boundaryElement) return;
342
- setPosition((0, $edcf132a9284368a$export$b3ceb0cbf1056d98)({
342
+ let position = (0, $edcf132a9284368a$export$b3ceb0cbf1056d98)({
343
343
  placement: $2a41e45df1593e64$var$translateRTL(placement, direction),
344
344
  overlayNode: overlayRef.current,
345
345
  targetNode: targetRef.current,
@@ -350,7 +350,13 @@ function $2a41e45df1593e64$export$d39e1813b3bdd0e1(props) {
350
350
  offset: offset,
351
351
  crossOffset: crossOffset,
352
352
  maxHeight: maxHeight
353
- }));
353
+ });
354
+ // Modify overlay styles directly so positioning happens immediately without the need of a second render
355
+ // This is so we don't have to delay autoFocus scrolling or delay applying preventScroll for popovers
356
+ Object.keys(position.position).forEach((key)=>overlayRef.current.style[key] = position.position[key] + "px");
357
+ overlayRef.current.style.maxHeight = position.maxHeight != null ? position.maxHeight + "px" : undefined;
358
+ // Trigger a set state for a second render anyway for arrow positioning
359
+ setPosition(position);
354
360
  // eslint-disable-next-line react-hooks/exhaustive-deps
355
361
  }, deps);
356
362
  // Update position when anything changes
@@ -1152,20 +1158,35 @@ let $5e3802645cc19319$var$observerStack = [];
1152
1158
  function $5e3802645cc19319$export$1c3ebcada18427bf(targets, root = document.body) {
1153
1159
  let visibleNodes = new Set(targets);
1154
1160
  let hiddenNodes = new Set();
1155
- let walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {
1156
- acceptNode (node) {
1157
- // If this node is a live announcer, add it to the set of nodes to keep visible.
1158
- if ((node instanceof HTMLElement || node instanceof SVGElement) && node.dataset.liveAnnouncer === "true") visibleNodes.add(node);
1161
+ let walk = (root)=>{
1162
+ // Keep live announcer and top layer elements (e.g. toasts) visible.
1163
+ for (let element of root.querySelectorAll("[data-live-announcer], [data-react-aria-top-layer]"))visibleNodes.add(element);
1164
+ let acceptNode = (node)=>{
1159
1165
  // Skip this node and its children if it is one of the target nodes, or a live announcer.
1160
1166
  // Also skip children of already hidden nodes, as aria-hidden is recursive. An exception is
1161
1167
  // made for elements with role="row" since VoiceOver on iOS has issues hiding elements with role="row".
1162
1168
  // For that case we want to hide the cells inside as well (https://bugs.webkit.org/show_bug.cgi?id=222623).
1163
1169
  if (visibleNodes.has(node) || hiddenNodes.has(node.parentElement) && node.parentElement.getAttribute("role") !== "row") return NodeFilter.FILTER_REJECT;
1164
1170
  // Skip this node but continue to children if one of the targets is inside the node.
1165
- if (targets.some((target)=>node.contains(target))) return NodeFilter.FILTER_SKIP;
1171
+ for (let target of visibleNodes){
1172
+ if (node.contains(target)) return NodeFilter.FILTER_SKIP;
1173
+ }
1166
1174
  return NodeFilter.FILTER_ACCEPT;
1175
+ };
1176
+ let walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, {
1177
+ acceptNode: acceptNode
1178
+ });
1179
+ // TreeWalker does not include the root.
1180
+ let acceptRoot = acceptNode(root);
1181
+ if (acceptRoot === NodeFilter.FILTER_ACCEPT) hide(root);
1182
+ if (acceptRoot !== NodeFilter.FILTER_REJECT) {
1183
+ let node = walker.nextNode();
1184
+ while(node != null){
1185
+ hide(node);
1186
+ node = walker.nextNode();
1187
+ }
1167
1188
  }
1168
- });
1189
+ };
1169
1190
  let hide = (node)=>{
1170
1191
  var _refCountMap_get;
1171
1192
  let refCount = (_refCountMap_get = $5e3802645cc19319$var$refCountMap.get(node)) !== null && _refCountMap_get !== void 0 ? _refCountMap_get : 0;
@@ -1179,11 +1200,7 @@ function $5e3802645cc19319$export$1c3ebcada18427bf(targets, root = document.body
1179
1200
  // If there is already a MutationObserver listening from a previous call,
1180
1201
  // disconnect it so the new on takes over.
1181
1202
  if ($5e3802645cc19319$var$observerStack.length) $5e3802645cc19319$var$observerStack[$5e3802645cc19319$var$observerStack.length - 1].disconnect();
1182
- let node = walker.nextNode();
1183
- while(node != null){
1184
- hide(node);
1185
- node = walker.nextNode();
1186
- }
1203
+ walk(root);
1187
1204
  let observer = new MutationObserver((changes)=>{
1188
1205
  for (let change of changes){
1189
1206
  if (change.type !== "childList" || change.addedNodes.length === 0) continue;
@@ -1192,9 +1209,15 @@ function $5e3802645cc19319$export$1c3ebcada18427bf(targets, root = document.body
1192
1209
  if (![
1193
1210
  ...visibleNodes,
1194
1211
  ...hiddenNodes
1195
- ].some((node)=>node.contains(change.target))) for (let node of change.addedNodes){
1196
- if ((node instanceof HTMLElement || node instanceof SVGElement) && node.dataset.liveAnnouncer === "true") visibleNodes.add(node);
1197
- else if (node instanceof Element) hide(node);
1212
+ ].some((node)=>node.contains(change.target))) {
1213
+ for (let node of change.removedNodes)if (node instanceof Element) {
1214
+ visibleNodes.delete(node);
1215
+ hiddenNodes.delete(node);
1216
+ }
1217
+ for (let node1 of change.addedNodes){
1218
+ if ((node1 instanceof HTMLElement || node1 instanceof SVGElement) && (node1.dataset.liveAnnouncer === "true" || node1.dataset.reactAriaTopLayer === "true")) visibleNodes.add(node1);
1219
+ else if (node1 instanceof Element) walk(node1);
1220
+ }
1198
1221
  }
1199
1222
  }
1200
1223
  });
@@ -1247,7 +1270,6 @@ function $5e3802645cc19319$export$1c3ebcada18427bf(targets, root = document.body
1247
1270
 
1248
1271
 
1249
1272
 
1250
-
1251
1273
  function $f2f8a6077418541e$export$542a6fd13ac93354(props, state) {
1252
1274
  let { triggerRef: triggerRef , popoverRef: popoverRef , isNonModal: isNonModal , isKeyboardDismissDisabled: isKeyboardDismissDisabled , ...otherProps } = props;
1253
1275
  let { overlayProps: overlayProps , underlayProps: underlayProps } = (0, $a11501f3d1d39e6c$export$ea8f71083e90600f)({
@@ -1264,18 +1286,8 @@ function $f2f8a6077418541e$export$542a6fd13ac93354(props, state) {
1264
1286
  isOpen: state.isOpen,
1265
1287
  onClose: null
1266
1288
  });
1267
- // Delay preventing scroll until popover is positioned to avoid extra scroll padding.
1268
- // This requires a layout effect so that positioning has been committed to the DOM
1269
- // by the time usePreventScroll measures the element.
1270
- let [isPositioned, setPositioned] = (0, $k7QOs$useState)(false);
1271
- (0, $k7QOs$useLayoutEffect)(()=>{
1272
- if (!isNonModal && placement) setPositioned(true);
1273
- }, [
1274
- isNonModal,
1275
- placement
1276
- ]);
1277
1289
  (0, $49c51c25361d4cd2$export$ee0f7cc6afcd1c18)({
1278
- isDisabled: isNonModal || !isPositioned
1290
+ isDisabled: isNonModal
1279
1291
  });
1280
1292
  (0, $k7QOs$useLayoutEffect)(()=>{
1281
1293
  if (state.isOpen && !isNonModal && popoverRef.current) return (0, $5e3802645cc19319$export$1c3ebcada18427bf)([