diff options
Diffstat (limited to 'popperjs/package/lib/modifiers/hide.js.flow')
-rw-r--r-- | popperjs/package/lib/modifiers/hide.js.flow | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/popperjs/package/lib/modifiers/hide.js.flow b/popperjs/package/lib/modifiers/hide.js.flow new file mode 100644 index 0000000..ee7476a --- /dev/null +++ b/popperjs/package/lib/modifiers/hide.js.flow @@ -0,0 +1,76 @@ +// @flow +import type { + ModifierArguments, + Modifier, + Rect, + SideObject, + Offsets, +} from '../types'; +import { top, bottom, left, right } from '../enums'; +import detectOverflow from '../utils/detectOverflow'; + +function getSideOffsets( + overflow: SideObject, + rect: Rect, + preventedOffsets: Offsets = { x: 0, y: 0 } +): SideObject { + return { + top: overflow.top - rect.height - preventedOffsets.y, + right: overflow.right - rect.width + preventedOffsets.x, + bottom: overflow.bottom - rect.height + preventedOffsets.y, + left: overflow.left - rect.width - preventedOffsets.x, + }; +} + +function isAnySideFullyClipped(overflow: SideObject): boolean { + return [top, right, bottom, left].some((side) => overflow[side] >= 0); +} + +function hide({ state, name }: ModifierArguments<{||}>) { + const referenceRect = state.rects.reference; + const popperRect = state.rects.popper; + const preventedOffsets = state.modifiersData.preventOverflow; + + const referenceOverflow = detectOverflow(state, { + elementContext: 'reference', + }); + const popperAltOverflow = detectOverflow(state, { + altBoundary: true, + }); + + const referenceClippingOffsets = getSideOffsets( + referenceOverflow, + referenceRect + ); + const popperEscapeOffsets = getSideOffsets( + popperAltOverflow, + popperRect, + preventedOffsets + ); + + const isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); + const hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); + + state.modifiersData[name] = { + referenceClippingOffsets, + popperEscapeOffsets, + isReferenceHidden, + hasPopperEscaped, + }; + + state.attributes.popper = { + ...state.attributes.popper, + 'data-popper-reference-hidden': isReferenceHidden, + 'data-popper-escaped': hasPopperEscaped, + }; +} + +// eslint-disable-next-line import/no-unused-modules +export type HideModifier = Modifier<'hide', {||}>; +export default ({ + name: 'hide', + enabled: true, + phase: 'main', + requiresIfExists: ['preventOverflow'], + fn: hide, +}: HideModifier); |