@ariakit/react-core
Version:
Ariakit React core
124 lines (99 loc) • 4.11 kB
JavaScript
;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;