UNPKG

@ariakit/react-core

Version:

Ariakit React core

133 lines (131 loc) 4.05 kB
"use client"; import { useHovercardProviderContext } from "../__chunks/2WDBOH5E.js"; import { useVisuallyHidden } from "../__chunks/RBTTLCIN.js"; import { useDialogDisclosure } from "../__chunks/GYHYTZZN.js"; import "../__chunks/NJZUP4KO.js"; import "../__chunks/MWF5B7KS.js"; import "../__chunks/63N3TCQX.js"; import "../__chunks/FFSBKSAM.js"; import "../__chunks/J4DPQC5Y.js"; import "../__chunks/WJ7PHYH7.js"; import "../__chunks/US3TW2XI.js"; import "../__chunks/SWN3JYXT.js"; import { createElement, createHook, forwardRef } from "../__chunks/ILRXHV7V.js"; import { useEvent, useMergeRefs } from "../__chunks/K2XTQB3X.js"; import "../__chunks/YXGXYGQX.js"; // src/hovercard/hovercard-disclosure.tsx import { contains } from "@ariakit/core/utils/dom"; import { addGlobalEventListener } from "@ariakit/core/utils/events"; import { invariant } from "@ariakit/core/utils/misc"; import { sync } from "@ariakit/core/utils/store"; import { useEffect, useState } from "react"; import { jsx } from "react/jsx-runtime"; var TagName = "button"; var useHovercardDisclosure = createHook(function useHovercardDisclosure2({ store, ...props }) { const context = useHovercardProviderContext(); store = store || context; invariant( store, process.env.NODE_ENV !== "production" && "HovercardDisclosure must receive a `store` prop or be wrapped in a HovercardProvider component." ); const [visible, setVisible] = useState(false); useEffect(() => { if (!visible) return; const onBlur = (event) => { if (!store) return; const nextActiveElement = event.relatedTarget; if (nextActiveElement) { const { anchorElement: anchor, popoverElement: popover, disclosureElement: disclosure } = store.getState(); if (anchor && contains(anchor, nextActiveElement)) return; if (popover && contains(popover, nextActiveElement)) return; if (disclosure && contains(disclosure, nextActiveElement)) return; if (nextActiveElement.hasAttribute("data-focus-trap")) return; } setVisible(false); }; return addGlobalEventListener("focusout", onBlur, true); }, [visible, store]); useEffect(() => { return sync(store, ["anchorElement"], (state) => { const anchor = state.anchorElement; if (!anchor) return; const observer = new MutationObserver(() => { if (!anchor.hasAttribute("data-focus-visible")) return; setVisible(true); }); observer.observe(anchor, { attributeFilter: ["data-focus-visible"] }); return () => observer.disconnect(); }); }, [store]); const onClickProp = props.onClick; const onClick = useEvent((event) => { onClickProp == null ? void 0 : onClickProp(event); if (event.defaultPrevented) return; store == null ? void 0 : store.setAutoFocusOnShow(true); }); const onFocusProp = props.onFocus; const onFocus = useEvent((event) => { onFocusProp == null ? void 0 : onFocusProp(event); if (event.defaultPrevented) return; setVisible(true); }); const { style } = useVisuallyHidden(); if (!visible) { props = { ...props, style: { ...style, ...props.style } }; } const children = /* @__PURE__ */ jsx( "svg", { display: "block", fill: "none", stroke: "currentColor", strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, viewBox: "0 0 16 16", height: "1em", width: "1em", children: /* @__PURE__ */ jsx("polyline", { points: "4,6 8,10 12,6" }) } ); props = { children, ...props, ref: useMergeRefs(store.setDisclosureElement, props.ref), onClick, onFocus }; props = useDialogDisclosure({ store, ...props }); return props; }); var HovercardDisclosure = forwardRef(function HovercardDisclosure2(props) { const htmlProps = useHovercardDisclosure(props); return createElement(TagName, htmlProps); }); export { HovercardDisclosure, useHovercardDisclosure };