UNPKG

@ariakit/react-core

Version:

Ariakit React core

124 lines (99 loc) 4.11 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); var _D6FV6EYScjs = require('./D6FV6EYS.cjs'); var _WULEED4Qcjs = require('./WULEED4Q.cjs'); var _OZM4QA2Vcjs = require('./OZM4QA2V.cjs'); var _7EQBAZ46cjs = require('./7EQBAZ46.cjs'); // src/composite/composite-hover.tsx var _dom = require('@ariakit/core/utils/dom'); var _focus = require('@ariakit/core/utils/focus'); var _misc = require('@ariakit/core/utils/misc'); var _react = require('react'); var TagName = "div"; function getMouseDestination(event) { const relatedTarget = event.relatedTarget; if ((relatedTarget == null ? void 0 : relatedTarget.nodeType) === Node.ELEMENT_NODE) { return relatedTarget; } return null; } function hoveringInside(event) { const nextElement = getMouseDestination(event); if (!nextElement) return false; return _dom.contains.call(void 0, event.currentTarget, nextElement); } var symbol = Symbol("composite-hover"); function movingToAnotherItem(event) { let dest = getMouseDestination(event); if (!dest) return false; do { if (_misc.hasOwnProperty.call(void 0, dest, symbol) && dest[symbol]) return true; dest = dest.parentElement; } while (dest); return false; } var useCompositeHover = _WULEED4Qcjs.createHook.call(void 0, function useCompositeHover2(_a) { var _b = _a, { store, focusOnHover = true, blurOnHoverEnd = !!focusOnHover } = _b, props = _7EQBAZ46cjs.__objRest.call(void 0, _b, [ "store", "focusOnHover", "blurOnHoverEnd" ]); const context = _D6FV6EYScjs.useCompositeContext.call(void 0, ); store = store || context; _misc.invariant.call(void 0, store, process.env.NODE_ENV !== "production" && "CompositeHover must be wrapped in a Composite component." ); const isMouseMoving = _OZM4QA2Vcjs.useIsMouseMoving.call(void 0, ); const onMouseMoveProp = props.onMouseMove; const focusOnHoverProp = _OZM4QA2Vcjs.useBooleanEvent.call(void 0, focusOnHover); const onMouseMove = _OZM4QA2Vcjs.useEvent.call(void 0, (event) => { onMouseMoveProp == null ? void 0 : onMouseMoveProp(event); if (event.defaultPrevented) return; if (!isMouseMoving()) return; if (!focusOnHoverProp(event)) return; if (!_focus.hasFocusWithin.call(void 0, event.currentTarget)) { const baseElement = store == null ? void 0 : store.getState().baseElement; if (baseElement && !_focus.hasFocus.call(void 0, baseElement)) { baseElement.focus(); } } store == null ? void 0 : store.setActiveId(event.currentTarget.id); }); const onMouseLeaveProp = props.onMouseLeave; const blurOnHoverEndProp = _OZM4QA2Vcjs.useBooleanEvent.call(void 0, blurOnHoverEnd); const onMouseLeave = _OZM4QA2Vcjs.useEvent.call(void 0, (event) => { var _a2; onMouseLeaveProp == null ? void 0 : onMouseLeaveProp(event); if (event.defaultPrevented) return; if (!isMouseMoving()) return; if (hoveringInside(event)) return; if (movingToAnotherItem(event)) return; if (!focusOnHoverProp(event)) return; if (!blurOnHoverEndProp(event)) return; store == null ? void 0 : store.setActiveId(null); (_a2 = store == null ? void 0 : store.getState().baseElement) == null ? void 0 : _a2.focus(); }); const ref = _react.useCallback.call(void 0, (element) => { if (!element) return; element[symbol] = true; }, []); props = _7EQBAZ46cjs.__spreadProps.call(void 0, _7EQBAZ46cjs.__spreadValues.call(void 0, {}, props), { ref: _OZM4QA2Vcjs.useMergeRefs.call(void 0, ref, props.ref), onMouseMove, onMouseLeave }); return _misc.removeUndefinedValues.call(void 0, props); } ); var CompositeHover = _WULEED4Qcjs.memo.call(void 0, _WULEED4Qcjs.forwardRef.call(void 0, function CompositeHover2(props) { const htmlProps = useCompositeHover(props); return _WULEED4Qcjs.createElement.call(void 0, TagName, htmlProps); }) ); exports.useCompositeHover = useCompositeHover; exports.CompositeHover = CompositeHover;