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.

62 lines (60 loc) 2.04 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FloatingRootStore = void 0; var _store = require("@base-ui-components/utils/store"); var _createEventEmitter = require("../utils/createEventEmitter"); const selectors = { open: (0, _store.createSelector)(state => state.open), domReferenceElement: (0, _store.createSelector)(state => state.domReferenceElement), referenceElement: (0, _store.createSelector)(state => state.positionReference ?? state.referenceElement), floatingElement: (0, _store.createSelector)(state => state.floatingElement), floatingId: (0, _store.createSelector)(state => state.floatingId) }; class FloatingRootStore extends _store.ReactStore { constructor(options) { const { nested, noEmit, onOpenChange, triggerElements, ...initialState } = options; super({ ...initialState, positionReference: initialState.referenceElement, domReferenceElement: initialState.referenceElement }, { onOpenChange, dataRef: { current: {} }, events: (0, _createEventEmitter.createEventEmitter)(), nested, noEmit, triggerElements }, selectors); } /** * Emits the `openchange` event through the internal event emitter and calls the `onOpenChange` handler with the provided arguments. * * @param newOpen The new open state. * @param eventDetails Details about the event that triggered the open state change. */ setOpen = (newOpen, eventDetails) => { this.context.dataRef.current.openEvent = newOpen ? eventDetails.event : undefined; if (!this.context.noEmit) { const details = { open: newOpen, reason: eventDetails.reason, nativeEvent: eventDetails.event, nested: this.context.nested, triggerElement: eventDetails.trigger }; this.context.events.emit('openchange', details); } this.context.onOpenChange?.(newOpen, eventDetails); }; } exports.FloatingRootStore = FloatingRootStore;