@base-ui-components/react
Version:
Base UI is a library of headless ('unstyled') React components and low-level hooks. You gain complete control over your app's CSS and accessibility features.
58 lines (56 loc) • 2.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useFloatingRootContext = useFloatingRootContext;
var _dom = require("@floating-ui/utils/dom");
var _useId = require("@base-ui-components/utils/useId");
var _useRefWithInit = require("@base-ui-components/utils/useRefWithInit");
var _useIsoLayoutEffect = require("@base-ui-components/utils/useIsoLayoutEffect");
var _FloatingTree = require("../components/FloatingTree");
var _FloatingRootStore = require("../components/FloatingRootStore");
var _popups = require("../../utils/popups");
function useFloatingRootContext(options) {
const {
open = false,
onOpenChange,
elements = {}
} = options;
const floatingId = (0, _useId.useId)();
const nested = (0, _FloatingTree.useFloatingParentNodeId)() != null;
if (process.env.NODE_ENV !== 'production') {
const optionDomReference = elements.reference;
if (optionDomReference && !(0, _dom.isElement)(optionDomReference)) {
console.error('Cannot pass a virtual element to the `elements.reference` option,', 'as it must be a real DOM element. Use `context.setPositionReference()`', 'instead.');
}
}
const store = (0, _useRefWithInit.useRefWithInit)(() => new _FloatingRootStore.FloatingRootStore({
open,
onOpenChange,
referenceElement: elements.reference ?? null,
floatingElement: elements.floating ?? null,
triggerElements: elements.triggers ?? new _popups.PopupTriggerMap(),
floatingId,
nested,
noEmit: options.noEmit || false
})).current;
(0, _useIsoLayoutEffect.useIsoLayoutEffect)(() => {
const valuesToSync = {
open,
floatingId
};
// Only sync elements that are defined to avoid overwriting existing ones
if (elements.reference !== undefined) {
valuesToSync.referenceElement = elements.reference;
valuesToSync.domReferenceElement = (0, _dom.isElement)(elements.reference) ? elements.reference : null;
}
if (elements.floating !== undefined) {
valuesToSync.floatingElement = elements.floating;
}
store.update(valuesToSync);
}, [open, floatingId, elements.reference, elements.floating, store]);
store.context.onOpenChange = onOpenChange;
store.context.nested = nested;
store.context.noEmit = options.noEmit || false;
return store;
}