79 lines
3.4 KiB
Plaintext
79 lines
3.4 KiB
Plaintext
import {useSlotId as $i6df2$useSlotId, filterDOMProps as $i6df2$filterDOMProps} from "@react-aria/utils";
|
|
import {focusSafely as $i6df2$focusSafely} from "@react-aria/focus";
|
|
import {useRef as $i6df2$useRef, useEffect as $i6df2$useEffect} from "react";
|
|
import {useOverlayFocusContain as $i6df2$useOverlayFocusContain} from "@react-aria/overlays";
|
|
|
|
/*
|
|
* Copyright 2020 Adobe. All rights reserved.
|
|
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License. You may obtain a copy
|
|
* of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software distributed under
|
|
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
* OF ANY KIND, either express or implied. See the License for the specific language
|
|
* governing permissions and limitations under the License.
|
|
*/
|
|
|
|
|
|
|
|
function $40df3f8667284809$export$d55e7ee900f34e93(props, ref) {
|
|
let { role: role = 'dialog' } = props;
|
|
let titleId = (0, $i6df2$useSlotId)();
|
|
titleId = props['aria-label'] ? undefined : titleId;
|
|
let isRefocusing = (0, $i6df2$useRef)(false);
|
|
// Focus the dialog itself on mount, unless a child element is already focused.
|
|
(0, $i6df2$useEffect)(()=>{
|
|
if (ref.current && !ref.current.contains(document.activeElement)) {
|
|
(0, $i6df2$focusSafely)(ref.current);
|
|
// Safari on iOS does not move the VoiceOver cursor to the dialog
|
|
// or announce that it has opened until it has rendered. A workaround
|
|
// is to wait for half a second, then blur and re-focus the dialog.
|
|
let timeout = setTimeout(()=>{
|
|
if (document.activeElement === ref.current) {
|
|
isRefocusing.current = true;
|
|
if (ref.current) {
|
|
ref.current.blur();
|
|
(0, $i6df2$focusSafely)(ref.current);
|
|
}
|
|
isRefocusing.current = false;
|
|
}
|
|
}, 500);
|
|
return ()=>{
|
|
clearTimeout(timeout);
|
|
};
|
|
}
|
|
}, [
|
|
ref
|
|
]);
|
|
(0, $i6df2$useOverlayFocusContain)();
|
|
// We do not use aria-modal due to a Safari bug which forces the first focusable element to be focused
|
|
// on mount when inside an iframe, no matter which element we programmatically focus.
|
|
// See https://bugs.webkit.org/show_bug.cgi?id=211934.
|
|
// useModal sets aria-hidden on all elements outside the dialog, so the dialog will behave as a modal
|
|
// even without aria-modal on the dialog itself.
|
|
return {
|
|
dialogProps: {
|
|
...(0, $i6df2$filterDOMProps)(props, {
|
|
labelable: true
|
|
}),
|
|
role: role,
|
|
tabIndex: -1,
|
|
'aria-labelledby': props['aria-labelledby'] || titleId,
|
|
// Prevent blur events from reaching useOverlay, which may cause
|
|
// popovers to close. Since focus is contained within the dialog,
|
|
// we don't want this to occur due to the above useEffect.
|
|
onBlur: (e)=>{
|
|
if (isRefocusing.current) e.stopPropagation();
|
|
}
|
|
},
|
|
titleProps: {
|
|
id: titleId
|
|
}
|
|
};
|
|
}
|
|
|
|
|
|
export {$40df3f8667284809$export$d55e7ee900f34e93 as useDialog};
|
|
//# sourceMappingURL=useDialog.module.js.map
|