import {dom as $b7b7a92703138c9b$export$df3a06d6289f983e, useContextProps as $b7b7a92703138c9b$export$29f1550f4b0d4415, useRenderProps as $b7b7a92703138c9b$export$4d86445c2cf5e3} from "./utils.js";
import {OverlayArrowContext as $5cdd5922a5c055ad$export$2de4954e8ae13b9f} from "./OverlayArrow.js";
import {OverlayTriggerStateContext as $acf8e70c2f419f18$export$d2f961adcb0afbe} from "./Dialog.js";
import {usePopover as $jx81S$usePopover} from "react-aria/usePopover";
import {DismissButton as $jx81S$DismissButton, Overlay as $jx81S$Overlay} from "react-aria/Overlay";
import {filterDOMProps as $jx81S$filterDOMProps} from "react-aria/private/utils/filterDOMProps";
import {focusSafely as $jx81S$focusSafely} from "react-aria/private/interactions/focusSafely";
import {getInteractionModality as $jx81S$getInteractionModality} from "react-aria/private/interactions/useFocusVisible";
import {isFocusWithin as $jx81S$isFocusWithin} from "react-aria/private/utils/shadowdom/DOMFunctions";
import {mergeProps as $jx81S$mergeProps} from "react-aria/mergeProps";
import {useOverlayTriggerState as $jx81S$useOverlayTriggerState} from "react-stately/useOverlayTriggerState";
import $jx81S$react, {createContext as $jx81S$createContext, forwardRef as $jx81S$forwardRef, useContext as $jx81S$useContext, useRef as $jx81S$useRef, useState as $jx81S$useState, useEffect as $jx81S$useEffect, useMemo as $jx81S$useMemo} from "react";
import {useExitAnimation as $jx81S$useExitAnimation, useEnterAnimation as $jx81S$useEnterAnimation} from "react-aria/private/utils/animation";
import {useIsHidden as $jx81S$useIsHidden} from "react-aria/private/collections/Hidden";
import {useLayoutEffect as $jx81S$useLayoutEffect} from "react-aria/private/utils/useLayoutEffect";
import {useLocale as $jx81S$useLocale} from "react-aria/I18nProvider";

/*
 * Copyright 2022 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.
 */ 















const $03df2f2d3cffb62f$export$9b9a0cd73afb7ca4 = /*#__PURE__*/ (0, $jx81S$createContext)(null);
// Stores a ref for the portal container for a group of popovers (e.g. submenus).
const $03df2f2d3cffb62f$var$PopoverGroupContext = /*#__PURE__*/ (0, $jx81S$createContext)(null);
const $03df2f2d3cffb62f$export$5b6b19405a83ff9d = /*#__PURE__*/ (0, $jx81S$forwardRef)(function Popover(props, ref) {
    [props, ref] = (0, $b7b7a92703138c9b$export$29f1550f4b0d4415)(props, ref, $03df2f2d3cffb62f$export$9b9a0cd73afb7ca4);
    let contextState = (0, $jx81S$useContext)((0, $acf8e70c2f419f18$export$d2f961adcb0afbe));
    let localState = (0, $jx81S$useOverlayTriggerState)(props);
    let state = props.isOpen != null || props.defaultOpen != null || !contextState ? localState : contextState;
    let isExiting = (0, $jx81S$useExitAnimation)(ref, state.isOpen) || props.isExiting || false;
    let isHidden = (0, $jx81S$useIsHidden)();
    let { direction: direction } = (0, $jx81S$useLocale)();
    // If we are in a hidden tree, we still need to preserve our children.
    if (isHidden) {
        let children = props.children;
        if (typeof children === 'function') children = children({
            trigger: props.trigger || null,
            placement: 'bottom',
            isEntering: false,
            isExiting: false,
            defaultChildren: null
        });
        return /*#__PURE__*/ (0, $jx81S$react).createElement((0, $jx81S$react).Fragment, null, children);
    }
    if (state && !state.isOpen && !isExiting) return null;
    return /*#__PURE__*/ (0, $jx81S$react).createElement($03df2f2d3cffb62f$var$PopoverInner, {
        ...props,
        triggerRef: props.triggerRef,
        state: state,
        popoverRef: ref,
        isExiting: isExiting,
        dir: direction
    });
});
function $03df2f2d3cffb62f$var$PopoverInner({ state: state, isExiting: isExiting, UNSTABLE_portalContainer: UNSTABLE_portalContainer, clearContexts: clearContexts, ...props }) {
    // Calculate the arrow size internally (and remove props.arrowSize from PopoverProps)
    // Referenced from: packages/@react-spectrum/tooltip/src/TooltipTrigger.tsx
    let arrowRef = (0, $jx81S$useRef)(null);
    let containerRef = (0, $jx81S$useRef)(null);
    let groupCtx = (0, $jx81S$useContext)($03df2f2d3cffb62f$var$PopoverGroupContext);
    let isSubPopover = groupCtx && props.trigger === 'SubmenuTrigger';
    var _props_offset;
    let { popoverProps: popoverProps, underlayProps: underlayProps, arrowProps: arrowProps, placement: placement, triggerAnchorPoint: triggerAnchorPoint } = (0, $jx81S$usePopover)({
        ...props,
        offset: (_props_offset = props.offset) !== null && _props_offset !== void 0 ? _props_offset : 8,
        arrowRef: arrowRef,
        // If this is a submenu/subdialog, use the root popover's container
        // to detect outside interaction and add aria-hidden.
        groupRef: isSubPopover ? groupCtx : containerRef
    }, state);
    let ref = props.popoverRef;
    let isEntering = (0, $jx81S$useEnterAnimation)(ref, !!placement) || props.isEntering || false;
    let renderProps = (0, $b7b7a92703138c9b$export$4d86445c2cf5e3)({
        ...props,
        defaultClassName: 'react-aria-Popover',
        values: {
            trigger: props.trigger || null,
            placement: placement,
            isEntering: isEntering,
            isExiting: isExiting
        }
    });
    // Automatically render Popover with role=dialog except when isNonModal is true,
    // or a dialog is already nested inside the popover.
    let shouldBeDialog = !props.isNonModal || props.trigger === 'SubmenuTrigger';
    let [isDialog, setDialog] = (0, $jx81S$useState)(false);
    (0, $jx81S$useLayoutEffect)(()=>{
        if (ref.current) setDialog(shouldBeDialog && !ref.current.querySelector('[role=dialog]'));
    }, [
        ref,
        shouldBeDialog
    ]);
    // Focus the popover itself on mount, unless a child element is already focused.
    // Skip this for submenus since hovering a submenutrigger should keep focus on the trigger
    (0, $jx81S$useEffect)(()=>{
        if (isDialog && (props.trigger !== 'SubmenuTrigger' || (0, $jx81S$getInteractionModality)() !== 'pointer') && ref.current && !(0, $jx81S$isFocusWithin)(ref.current)) (0, $jx81S$focusSafely)(ref.current);
    }, [
        isDialog,
        ref,
        props.trigger
    ]);
    let children = (0, $jx81S$useMemo)(()=>{
        let children = renderProps.children;
        if (clearContexts) for (let Context of clearContexts)children = /*#__PURE__*/ (0, $jx81S$react).createElement(Context.Provider, {
            value: null
        }, children);
        return children;
    }, [
        renderProps.children,
        clearContexts
    ]);
    let style = {
        ...popoverProps.style,
        '--trigger-anchor-point': triggerAnchorPoint ? `${triggerAnchorPoint.x}px ${triggerAnchorPoint.y}px` : undefined,
        ...renderProps.style
    };
    let overlay = /*#__PURE__*/ (0, $jx81S$react).createElement((0, $b7b7a92703138c9b$export$df3a06d6289f983e).div, {
        ...(0, $jx81S$mergeProps)((0, $jx81S$filterDOMProps)(props, {
            global: true
        }), popoverProps),
        ...renderProps,
        role: isDialog ? 'dialog' : undefined,
        tabIndex: isDialog ? -1 : undefined,
        "aria-label": props['aria-label'],
        "aria-labelledby": props['aria-labelledby'],
        ref: ref,
        slot: props.slot || undefined,
        style: style,
        dir: props.dir,
        "data-trigger": props.trigger,
        "data-placement": placement,
        "data-entering": isEntering || undefined,
        "data-exiting": isExiting || undefined
    }, !props.isNonModal && /*#__PURE__*/ (0, $jx81S$react).createElement((0, $jx81S$DismissButton), {
        onDismiss: state.close
    }), /*#__PURE__*/ (0, $jx81S$react).createElement((0, $5cdd5922a5c055ad$export$2de4954e8ae13b9f).Provider, {
        value: {
            ...arrowProps,
            placement: placement,
            ref: arrowRef
        }
    }, children), /*#__PURE__*/ (0, $jx81S$react).createElement((0, $jx81S$DismissButton), {
        onDismiss: state.close
    }));
    // If this is a root popover, render an extra div to act as the portal container for submenus/subdialogs.
    if (!isSubPopover) return /*#__PURE__*/ (0, $jx81S$react).createElement((0, $jx81S$Overlay), {
        ...props,
        shouldContainFocus: isDialog,
        isExiting: isExiting,
        portalContainer: UNSTABLE_portalContainer
    }, !props.isNonModal && state.isOpen && /*#__PURE__*/ (0, $jx81S$react).createElement("div", {
        "data-testid": "underlay",
        ...underlayProps,
        style: {
            position: 'fixed',
            inset: 0
        }
    }), /*#__PURE__*/ (0, $jx81S$react).createElement("div", {
        ref: containerRef,
        style: {
            display: 'contents'
        }
    }, /*#__PURE__*/ (0, $jx81S$react).createElement($03df2f2d3cffb62f$var$PopoverGroupContext.Provider, {
        value: containerRef
    }, overlay)));
    var _ref;
    // Submenus/subdialogs are mounted into the root popover's container.
    return /*#__PURE__*/ (0, $jx81S$react).createElement((0, $jx81S$Overlay), {
        ...props,
        shouldContainFocus: isDialog,
        isExiting: isExiting,
        portalContainer: (_ref = UNSTABLE_portalContainer !== null && UNSTABLE_portalContainer !== void 0 ? UNSTABLE_portalContainer : groupCtx === null || groupCtx === void 0 ? void 0 : groupCtx.current) !== null && _ref !== void 0 ? _ref : undefined
    }, overlay);
}


export {$03df2f2d3cffb62f$export$9b9a0cd73afb7ca4 as PopoverContext, $03df2f2d3cffb62f$export$5b6b19405a83ff9d as Popover};
//# sourceMappingURL=Popover.js.map
