UNPKG

@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
"use strict"; 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; }