Add supporting themes required for Lotusdocs
This commit is contained in:
@@ -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);
|
||||
Reference in New Issue
Block a user