summaryrefslogtreecommitdiff
path: root/node_modules/@floating-ui
diff options
context:
space:
mode:
authorrxliuli <rxliuli@gmail.com>2025-11-04 05:03:50 +0800
committerrxliuli <rxliuli@gmail.com>2025-11-04 05:03:50 +0800
commitbce557cc2dc767628bed6aac87301a1be7c5431b (patch)
treeb51a051228d01fe3306cd7626d4a96768aadb944 /node_modules/@floating-ui
init commit
Diffstat (limited to 'node_modules/@floating-ui')
-rw-r--r--node_modules/@floating-ui/core/dist/floating-ui.core.mjs1046
-rw-r--r--node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs759
-rw-r--r--node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs154
-rw-r--r--node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs138
4 files changed, 2097 insertions, 0 deletions
diff --git a/node_modules/@floating-ui/core/dist/floating-ui.core.mjs b/node_modules/@floating-ui/core/dist/floating-ui.core.mjs
new file mode 100644
index 0000000..17f6a80
--- /dev/null
+++ b/node_modules/@floating-ui/core/dist/floating-ui.core.mjs
@@ -0,0 +1,1046 @@
+import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';
+export { rectToClientRect } from '@floating-ui/utils';
+
+function computeCoordsFromPlacement(_ref, placement, rtl) {
+ let {
+ reference,
+ floating
+ } = _ref;
+ const sideAxis = getSideAxis(placement);
+ const alignmentAxis = getAlignmentAxis(placement);
+ const alignLength = getAxisLength(alignmentAxis);
+ const side = getSide(placement);
+ const isVertical = sideAxis === 'y';
+ const commonX = reference.x + reference.width / 2 - floating.width / 2;
+ const commonY = reference.y + reference.height / 2 - floating.height / 2;
+ const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;
+ let coords;
+ switch (side) {
+ case 'top':
+ coords = {
+ x: commonX,
+ y: reference.y - floating.height
+ };
+ break;
+ case 'bottom':
+ coords = {
+ x: commonX,
+ y: reference.y + reference.height
+ };
+ break;
+ case 'right':
+ coords = {
+ x: reference.x + reference.width,
+ y: commonY
+ };
+ break;
+ case 'left':
+ coords = {
+ x: reference.x - floating.width,
+ y: commonY
+ };
+ break;
+ default:
+ coords = {
+ x: reference.x,
+ y: reference.y
+ };
+ }
+ switch (getAlignment(placement)) {
+ case 'start':
+ coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);
+ break;
+ case 'end':
+ coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);
+ break;
+ }
+ return coords;
+}
+
+/**
+ * Computes the `x` and `y` coordinates that will place the floating element
+ * next to a given reference element.
+ *
+ * This export does not have any `platform` interface logic. You will need to
+ * write one for the platform you are using Floating UI with.
+ */
+const computePosition = async (reference, floating, config) => {
+ const {
+ placement = 'bottom',
+ strategy = 'absolute',
+ middleware = [],
+ platform
+ } = config;
+ const validMiddleware = middleware.filter(Boolean);
+ const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));
+ let rects = await platform.getElementRects({
+ reference,
+ floating,
+ strategy
+ });
+ let {
+ x,
+ y
+ } = computeCoordsFromPlacement(rects, placement, rtl);
+ let statefulPlacement = placement;
+ let middlewareData = {};
+ let resetCount = 0;
+ for (let i = 0; i < validMiddleware.length; i++) {
+ const {
+ name,
+ fn
+ } = validMiddleware[i];
+ const {
+ x: nextX,
+ y: nextY,
+ data,
+ reset
+ } = await fn({
+ x,
+ y,
+ initialPlacement: placement,
+ placement: statefulPlacement,
+ strategy,
+ middlewareData,
+ rects,
+ platform,
+ elements: {
+ reference,
+ floating
+ }
+ });
+ x = nextX != null ? nextX : x;
+ y = nextY != null ? nextY : y;
+ middlewareData = {
+ ...middlewareData,
+ [name]: {
+ ...middlewareData[name],
+ ...data
+ }
+ };
+ if (reset && resetCount <= 50) {
+ resetCount++;
+ if (typeof reset === 'object') {
+ if (reset.placement) {
+ statefulPlacement = reset.placement;
+ }
+ if (reset.rects) {
+ rects = reset.rects === true ? await platform.getElementRects({
+ reference,
+ floating,
+ strategy
+ }) : reset.rects;
+ }
+ ({
+ x,
+ y
+ } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));
+ }
+ i = -1;
+ }
+ }
+ return {
+ x,
+ y,
+ placement: statefulPlacement,
+ strategy,
+ middlewareData
+ };
+};
+
+/**
+ * Resolves with an object of overflow side offsets that determine how much the
+ * element is overflowing a given clipping boundary on each side.
+ * - positive = overflowing the boundary by that number of pixels
+ * - negative = how many pixels left before it will overflow
+ * - 0 = lies flush with the boundary
+ * @see https://floating-ui.com/docs/detectOverflow
+ */
+async function detectOverflow(state, options) {
+ var _await$platform$isEle;
+ if (options === void 0) {
+ options = {};
+ }
+ const {
+ x,
+ y,
+ platform,
+ rects,
+ elements,
+ strategy
+ } = state;
+ const {
+ boundary = 'clippingAncestors',
+ rootBoundary = 'viewport',
+ elementContext = 'floating',
+ altBoundary = false,
+ padding = 0
+ } = evaluate(options, state);
+ const paddingObject = getPaddingObject(padding);
+ const altContext = elementContext === 'floating' ? 'reference' : 'floating';
+ const element = elements[altBoundary ? altContext : elementContext];
+ const clippingClientRect = rectToClientRect(await platform.getClippingRect({
+ element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),
+ boundary,
+ rootBoundary,
+ strategy
+ }));
+ const rect = elementContext === 'floating' ? {
+ x,
+ y,
+ width: rects.floating.width,
+ height: rects.floating.height
+ } : rects.reference;
+ const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));
+ const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {
+ x: 1,
+ y: 1
+ } : {
+ x: 1,
+ y: 1
+ };
+ const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({
+ elements,
+ rect,
+ offsetParent,
+ strategy
+ }) : rect);
+ return {
+ top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,
+ bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,
+ left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,
+ right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x
+ };
+}
+
+/**
+ * Provides data to position an inner element of the floating element so that it
+ * appears centered to the reference element.
+ * @see https://floating-ui.com/docs/arrow
+ */
+const arrow = options => ({
+ name: 'arrow',
+ options,
+ async fn(state) {
+ const {
+ x,
+ y,
+ placement,
+ rects,
+ platform,
+ elements,
+ middlewareData
+ } = state;
+ // Since `element` is required, we don't Partial<> the type.
+ const {
+ element,
+ padding = 0
+ } = evaluate(options, state) || {};
+ if (element == null) {
+ return {};
+ }
+ const paddingObject = getPaddingObject(padding);
+ const coords = {
+ x,
+ y
+ };
+ const axis = getAlignmentAxis(placement);
+ const length = getAxisLength(axis);
+ const arrowDimensions = await platform.getDimensions(element);
+ const isYAxis = axis === 'y';
+ const minProp = isYAxis ? 'top' : 'left';
+ const maxProp = isYAxis ? 'bottom' : 'right';
+ const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';
+ const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];
+ const startDiff = coords[axis] - rects.reference[axis];
+ const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));
+ let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;
+
+ // DOM platform can return `window` as the `offsetParent`.
+ if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {
+ clientSize = elements.floating[clientProp] || rects.floating[length];
+ }
+ const centerToReference = endDiff / 2 - startDiff / 2;
+
+ // If the padding is large enough that it causes the arrow to no longer be
+ // centered, modify the padding so that it is centered.
+ const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;
+ const minPadding = min(paddingObject[minProp], largestPossiblePadding);
+ const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);
+
+ // Make sure the arrow doesn't overflow the floating element if the center
+ // point is outside the floating element's bounds.
+ const min$1 = minPadding;
+ const max = clientSize - arrowDimensions[length] - maxPadding;
+ const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;
+ const offset = clamp(min$1, center, max);
+
+ // If the reference is small enough that the arrow's padding causes it to
+ // to point to nothing for an aligned placement, adjust the offset of the
+ // floating element itself. To ensure `shift()` continues to take action,
+ // a single reset is performed when this is true.
+ const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;
+ const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;
+ return {
+ [axis]: coords[axis] + alignmentOffset,
+ data: {
+ [axis]: offset,
+ centerOffset: center - offset - alignmentOffset,
+ ...(shouldAddOffset && {
+ alignmentOffset
+ })
+ },
+ reset: shouldAddOffset
+ };
+ }
+});
+
+function getPlacementList(alignment, autoAlignment, allowedPlacements) {
+ const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);
+ return allowedPlacementsSortedByAlignment.filter(placement => {
+ if (alignment) {
+ return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);
+ }
+ return true;
+ });
+}
+/**
+ * Optimizes the visibility of the floating element by choosing the placement
+ * that has the most space available automatically, without needing to specify a
+ * preferred placement. Alternative to `flip`.
+ * @see https://floating-ui.com/docs/autoPlacement
+ */
+const autoPlacement = function (options) {
+ if (options === void 0) {
+ options = {};
+ }
+ return {
+ name: 'autoPlacement',
+ options,
+ async fn(state) {
+ var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;
+ const {
+ rects,
+ middlewareData,
+ placement,
+ platform,
+ elements
+ } = state;
+ const {
+ crossAxis = false,
+ alignment,
+ allowedPlacements = placements,
+ autoAlignment = true,
+ ...detectOverflowOptions
+ } = evaluate(options, state);
+ const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;
+ const overflow = await detectOverflow(state, detectOverflowOptions);
+ const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;
+ const currentPlacement = placements$1[currentIndex];
+ if (currentPlacement == null) {
+ return {};
+ }
+ const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));
+
+ // Make `computeCoords` start from the right place.
+ if (placement !== currentPlacement) {
+ return {
+ reset: {
+ placement: placements$1[0]
+ }
+ };
+ }
+ const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];
+ const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {
+ placement: currentPlacement,
+ overflows: currentOverflows
+ }];
+ const nextPlacement = placements$1[currentIndex + 1];
+
+ // There are more placements to check.
+ if (nextPlacement) {
+ return {
+ data: {
+ index: currentIndex + 1,
+ overflows: allOverflows
+ },
+ reset: {
+ placement: nextPlacement
+ }
+ };
+ }
+ const placementsSortedByMostSpace = allOverflows.map(d => {
+ const alignment = getAlignment(d.placement);
+ return [d.placement, alignment && crossAxis ?
+ // Check along the mainAxis and main crossAxis side.
+ d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :
+ // Check only the mainAxis.
+ d.overflows[0], d.overflows];
+ }).sort((a, b) => a[1] - b[1]);
+ const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,
+ // Aligned placements should not check their opposite crossAxis
+ // side.
+ getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));
+ const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];
+ if (resetPlacement !== placement) {
+ return {
+ data: {
+ index: currentIndex + 1,
+ overflows: allOverflows
+ },
+ reset: {
+ placement: resetPlacement
+ }
+ };
+ }
+ return {};
+ }
+ };
+};
+
+/**
+ * Optimizes the visibility of the floating element by flipping the `placement`
+ * in order to keep it in view when the preferred placement(s) will overflow the
+ * clipping boundary. Alternative to `autoPlacement`.
+ * @see https://floating-ui.com/docs/flip
+ */
+const flip = function (options) {
+ if (options === void 0) {
+ options = {};
+ }
+ return {
+ name: 'flip',
+ options,
+ async fn(state) {
+ var _middlewareData$arrow, _middlewareData$flip;
+ const {
+ placement,
+ middlewareData,
+ rects,
+ initialPlacement,
+ platform,
+ elements
+ } = state;
+ const {
+ mainAxis: checkMainAxis = true,
+ crossAxis: checkCrossAxis = true,
+ fallbackPlacements: specifiedFallbackPlacements,
+ fallbackStrategy = 'bestFit',
+ fallbackAxisSideDirection = 'none',
+ flipAlignment = true,
+ ...detectOverflowOptions
+ } = evaluate(options, state);
+
+ // If a reset by the arrow was caused due to an alignment offset being
+ // added, we should skip any logic now since `flip()` has already done its
+ // work.
+ // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643
+ if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {
+ return {};
+ }
+ const side = getSide(placement);
+ const initialSideAxis = getSideAxis(initialPlacement);
+ const isBasePlacement = getSide(initialPlacement) === initialPlacement;
+ const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));
+ const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));
+ const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';
+ if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {
+ fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));
+ }
+ const placements = [initialPlacement, ...fallbackPlacements];
+ const overflow = await detectOverflow(state, detectOverflowOptions);
+ const overflows = [];
+ let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];
+ if (checkMainAxis) {
+ overflows.push(overflow[side]);
+ }
+ if (checkCrossAxis) {
+ const sides = getAlignmentSides(placement, rects, rtl);
+ overflows.push(overflow[sides[0]], overflow[sides[1]]);
+ }
+ overflowsData = [...overflowsData, {
+ placement,
+ overflows
+ }];
+
+ // One or more sides is overflowing.
+ if (!overflows.every(side => side <= 0)) {
+ var _middlewareData$flip2, _overflowsData$filter;
+ const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;
+ const nextPlacement = placements[nextIndex];
+ if (nextPlacement) {
+ var _overflowsData$;
+ const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== getSideAxis(nextPlacement) : false;
+ const hasInitialMainAxisOverflow = ((_overflowsData$ = overflowsData[0]) == null ? void 0 : _overflowsData$.overflows[0]) > 0;
+ if (!ignoreCrossAxisOverflow || hasInitialMainAxisOverflow) {
+ // Try next placement and re-run the lifecycle.
+ return {
+ data: {
+ index: nextIndex,
+ overflows: overflowsData
+ },
+ reset: {
+ placement: nextPlacement
+ }
+ };
+ }
+ }
+
+ // First, find the candidates that fit on the mainAxis side of overflow,
+ // then find the placement that fits the best on the main crossAxis side.
+ let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;
+
+ // Otherwise fallback.
+ if (!resetPlacement) {
+ switch (fallbackStrategy) {
+ case 'bestFit':
+ {
+ var _overflowsData$filter2;
+ const placement = (_overflowsData$filter2 = overflowsData.filter(d => {
+ if (hasFallbackAxisSideDirection) {
+ const currentSideAxis = getSideAxis(d.placement);
+ return currentSideAxis === initialSideAxis ||
+ // Create a bias to the `y` side axis due to horizontal
+ // reading directions favoring greater width.
+ currentSideAxis === 'y';
+ }
+ return true;
+ }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];
+ if (placement) {
+ resetPlacement = placement;
+ }
+ break;
+ }
+ case 'initialPlacement':
+ resetPlacement = initialPlacement;
+ break;
+ }
+ }
+ if (placement !== resetPlacement) {
+ return {
+ reset: {
+ placement: resetPlacement
+ }
+ };
+ }
+ }
+ return {};
+ }
+ };
+};
+
+function getSideOffsets(overflow, rect) {
+ return {
+ top: overflow.top - rect.height,
+ right: overflow.right - rect.width,
+ bottom: overflow.bottom - rect.height,
+ left: overflow.left - rect.width
+ };
+}
+function isAnySideFullyClipped(overflow) {
+ return sides.some(side => overflow[side] >= 0);
+}
+/**
+ * Provides data to hide the floating element in applicable situations, such as
+ * when it is not in the same clipping context as the reference element.
+ * @see https://floating-ui.com/docs/hide
+ */
+const hide = function (options) {
+ if (options === void 0) {
+ options = {};
+ }
+ return {
+ name: 'hide',
+ options,
+ async fn(state) {
+ const {
+ rects
+ } = state;
+ const {
+ strategy = 'referenceHidden',
+ ...detectOverflowOptions
+ } = evaluate(options, state);
+ switch (strategy) {
+ case 'referenceHidden':
+ {
+ const overflow = await detectOverflow(state, {
+ ...detectOverflowOptions,
+ elementContext: 'reference'
+ });
+ const offsets = getSideOffsets(overflow, rects.reference);
+ return {
+ data: {
+ referenceHiddenOffsets: offsets,
+ referenceHidden: isAnySideFullyClipped(offsets)
+ }
+ };
+ }
+ case 'escaped':
+ {
+ const overflow = await detectOverflow(state, {
+ ...detectOverflowOptions,
+ altBoundary: true
+ });
+ const offsets = getSideOffsets(overflow, rects.floating);
+ return {
+ data: {
+ escapedOffsets: offsets,
+ escaped: isAnySideFullyClipped(offsets)
+ }
+ };
+ }
+ default:
+ {
+ return {};
+ }
+ }
+ }
+ };
+};
+
+function getBoundingRect(rects) {
+ const minX = min(...rects.map(rect => rect.left));
+ const minY = min(...rects.map(rect => rect.top));
+ const maxX = max(...rects.map(rect => rect.right));
+ const maxY = max(...rects.map(rect => rect.bottom));
+ return {
+ x: minX,
+ y: minY,
+ width: maxX - minX,
+ height: maxY - minY
+ };
+}
+function getRectsByLine(rects) {
+ const sortedRects = rects.slice().sort((a, b) => a.y - b.y);
+ const groups = [];
+ let prevRect = null;
+ for (let i = 0; i < sortedRects.length; i++) {
+ const rect = sortedRects[i];
+ if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {
+ groups.push([rect]);
+ } else {
+ groups[groups.length - 1].push(rect);
+ }
+ prevRect = rect;
+ }
+ return groups.map(rect => rectToClientRect(getBoundingRect(rect)));
+}
+/**
+ * Provides improved positioning for inline reference elements that can span
+ * over multiple lines, such as hyperlinks or range selections.
+ * @see https://floating-ui.com/docs/inline
+ */
+const inline = function (options) {
+ if (options === void 0) {
+ options = {};
+ }
+ return {
+ name: 'inline',
+ options,
+ async fn(state) {
+ const {
+ placement,
+ elements,
+ rects,
+ platform,
+ strategy
+ } = state;
+ // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a
+ // ClientRect's bounds, despite the event listener being triggered. A
+ // padding of 2 seems to handle this issue.
+ const {
+ padding = 2,
+ x,
+ y
+ } = evaluate(options, state);
+ const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);
+ const clientRects = getRectsByLine(nativeClientRects);
+ const fallback = rectToClientRect(getBoundingRect(nativeClientRects));
+ const paddingObject = getPaddingObject(padding);
+ function getBoundingClientRect() {
+ // There are two rects and they are disjoined.
+ if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {
+ // Find the first rect in which the point is fully inside.
+ return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;
+ }
+
+ // There are 2 or more connected rects.
+ if (clientRects.length >= 2) {
+ if (getSideAxis(placement) === 'y') {
+ const firstRect = clientRects[0];
+ const lastRect = clientRects[clientRects.length - 1];
+ const isTop = getSide(placement) === 'top';
+ const top = firstRect.top;
+ const bottom = lastRect.bottom;
+ const left = isTop ? firstRect.left : lastRect.left;
+ const right = isTop ? firstRect.right : lastRect.right;
+ const width = right - left;
+ const height = bottom - top;
+ return {
+ top,
+ bottom,
+ left,
+ right,
+ width,
+ height,
+ x: left,
+ y: top
+ };
+ }
+ const isLeftSide = getSide(placement) === 'left';
+ const maxRight = max(...clientRects.map(rect => rect.right));
+ const minLeft = min(...clientRects.map(rect => rect.left));
+ const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);
+ const top = measureRects[0].top;
+ const bottom = measureRects[measureRects.length - 1].bottom;
+ const left = minLeft;
+ const right = maxRight;
+ const width = right - left;
+ const height = bottom - top;
+ return {
+ top,
+ bottom,
+ left,
+ right,
+ width,
+ height,
+ x: left,
+ y: top
+ };
+ }
+ return fallback;
+ }
+ const resetRects = await platform.getElementRects({
+ reference: {
+ getBoundingClientRect
+ },
+ floating: elements.floating,
+ strategy
+ });
+ if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {
+ return {
+ reset: {
+ rects: resetRects
+ }
+ };
+ }
+ return {};
+ }
+ };
+};
+
+// For type backwards-compatibility, the `OffsetOptions` type was also
+// Derivable.
+
+async function convertValueToCoords(state, options) {
+ const {
+ placement,
+ platform,
+ elements
+ } = state;
+ const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));
+ const side = getSide(placement);
+ const alignment = getAlignment(placement);
+ const isVertical = getSideAxis(placement) === 'y';
+ const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;
+ const crossAxisMulti = rtl && isVertical ? -1 : 1;
+ const rawValue = evaluate(options, state);
+
+ // eslint-disable-next-line prefer-const
+ let {
+ mainAxis,
+ crossAxis,
+ alignmentAxis
+ } = typeof rawValue === 'number' ? {
+ mainAxis: rawValue,
+ crossAxis: 0,
+ alignmentAxis: null
+ } : {
+ mainAxis: rawValue.mainAxis || 0,
+ crossAxis: rawValue.crossAxis || 0,
+ alignmentAxis: rawValue.alignmentAxis
+ };
+ if (alignment && typeof alignmentAxis === 'number') {
+ crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;
+ }
+ return isVertical ? {
+ x: crossAxis * crossAxisMulti,
+ y: mainAxis * mainAxisMulti
+ } : {
+ x: mainAxis * mainAxisMulti,
+ y: crossAxis * crossAxisMulti
+ };
+}
+
+/**
+ * Modifies the placement by translating the floating element along the
+ * specified axes.
+ * A number (shorthand for `mainAxis` or distance), or an axes configuration
+ * object may be passed.
+ * @see https://floating-ui.com/docs/offset
+ */
+const offset = function (options) {
+ if (options === void 0) {
+ options = 0;
+ }
+ return {
+ name: 'offset',
+ options,
+ async fn(state) {
+ var _middlewareData$offse, _middlewareData$arrow;
+ const {
+ x,
+ y,
+ placement,
+ middlewareData
+ } = state;
+ const diffCoords = await convertValueToCoords(state, options);
+
+ // If the placement is the same and the arrow caused an alignment offset
+ // then we don't need to change the positioning coordinates.
+ if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {
+ return {};
+ }
+ return {
+ x: x + diffCoords.x,
+ y: y + diffCoords.y,
+ data: {
+ ...diffCoords,
+ placement
+ }
+ };
+ }
+ };
+};
+
+/**
+ * Optimizes the visibility of the floating element by shifting it in order to
+ * keep it in view when it will overflow the clipping boundary.
+ * @see https://floating-ui.com/docs/shift
+ */
+const shift = function (options) {
+ if (options === void 0) {
+ options = {};
+ }
+ return {
+ name: 'shift',
+ options,
+ async fn(state) {
+ const {
+ x,
+ y,
+ placement
+ } = state;
+ const {
+ mainAxis: checkMainAxis = true,
+ crossAxis: checkCrossAxis = false,
+ limiter = {
+ fn: _ref => {
+ let {
+ x,
+ y
+ } = _ref;
+ return {
+ x,
+ y
+ };
+ }
+ },
+ ...detectOverflowOptions
+ } = evaluate(options, state);
+ const coords = {
+ x,
+ y
+ };
+ const overflow = await detectOverflow(state, detectOverflowOptions);
+ const crossAxis = getSideAxis(getSide(placement));
+ const mainAxis = getOppositeAxis(crossAxis);
+ let mainAxisCoord = coords[mainAxis];
+ let crossAxisCoord = coords[crossAxis];
+ if (checkMainAxis) {
+ const minSide = mainAxis === 'y' ? 'top' : 'left';
+ const maxSide = mainAxis === 'y' ? 'bottom' : 'right';
+ const min = mainAxisCoord + overflow[minSide];
+ const max = mainAxisCoord - overflow[maxSide];
+ mainAxisCoord = clamp(min, mainAxisCoord, max);
+ }
+ if (checkCrossAxis) {
+ const minSide = crossAxis === 'y' ? 'top' : 'left';
+ const maxSide = crossAxis === 'y' ? 'bottom' : 'right';
+ const min = crossAxisCoord + overflow[minSide];
+ const max = crossAxisCoord - overflow[maxSide];
+ crossAxisCoord = clamp(min, crossAxisCoord, max);
+ }
+ const limitedCoords = limiter.fn({
+ ...state,
+ [mainAxis]: mainAxisCoord,
+ [crossAxis]: crossAxisCoord
+ });
+ return {
+ ...limitedCoords,
+ data: {
+ x: limitedCoords.x - x,
+ y: limitedCoords.y - y,
+ enabled: {
+ [mainAxis]: checkMainAxis,
+ [crossAxis]: checkCrossAxis
+ }
+ }
+ };
+ }
+ };
+};
+/**
+ * Built-in `limiter` that will stop `shift()` at a certain point.
+ */
+const limitShift = function (options) {
+ if (options === void 0) {
+ options = {};
+ }
+ return {
+ options,
+ fn(state) {
+ const {
+ x,
+ y,
+ placement,
+ rects,
+ middlewareData
+ } = state;
+ const {
+ offset = 0,
+ mainAxis: checkMainAxis = true,
+ crossAxis: checkCrossAxis = true
+ } = evaluate(options, state);
+ const coords = {
+ x,
+ y
+ };
+ const crossAxis = getSideAxis(placement);
+ const mainAxis = getOppositeAxis(crossAxis);
+ let mainAxisCoord = coords[mainAxis];
+ let crossAxisCoord = coords[crossAxis];
+ const rawOffset = evaluate(offset, state);
+ const computedOffset = typeof rawOffset === 'number' ? {
+ mainAxis: rawOffset,
+ crossAxis: 0
+ } : {
+ mainAxis: 0,
+ crossAxis: 0,
+ ...rawOffset
+ };
+ if (checkMainAxis) {
+ const len = mainAxis === 'y' ? 'height' : 'width';
+ const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;
+ const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;
+ if (mainAxisCoord < limitMin) {
+ mainAxisCoord = limitMin;
+ } else if (mainAxisCoord > limitMax) {
+ mainAxisCoord = limitMax;
+ }
+ }
+ if (checkCrossAxis) {
+ var _middlewareData$offse, _middlewareData$offse2;
+ const len = mainAxis === 'y' ? 'width' : 'height';
+ const isOriginSide = ['top', 'left'].includes(getSide(placement));
+ const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);
+ const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);
+ if (crossAxisCoord < limitMin) {
+ crossAxisCoord = limitMin;
+ } else if (crossAxisCoord > limitMax) {
+ crossAxisCoord = limitMax;
+ }
+ }
+ return {
+ [mainAxis]: mainAxisCoord,
+ [crossAxis]: crossAxisCoord
+ };
+ }
+ };
+};
+
+/**
+ * Provides data that allows you to change the size of the floating element —
+ * for instance, prevent it from overflowing the clipping boundary or match the
+ * width of the reference element.
+ * @see https://floating-ui.com/docs/size
+ */
+const size = function (options) {
+ if (options === void 0) {
+ options = {};
+ }
+ return {
+ name: 'size',
+ options,
+ async fn(state) {
+ var _state$middlewareData, _state$middlewareData2;
+ const {
+ placement,
+ rects,
+ platform,
+ elements
+ } = state;
+ const {
+ apply = () => {},
+ ...detectOverflowOptions
+ } = evaluate(options, state);
+ const overflow = await detectOverflow(state, detectOverflowOptions);
+ const side = getSide(placement);
+ const alignment = getAlignment(placement);
+ const isYAxis = getSideAxis(placement) === 'y';
+ const {
+ width,
+ height
+ } = rects.floating;
+ let heightSide;
+ let widthSide;
+ if (side === 'top' || side === 'bottom') {
+ heightSide = side;
+ widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';
+ } else {
+ widthSide = side;
+ heightSide = alignment === 'end' ? 'top' : 'bottom';
+ }
+ const maximumClippingHeight = height - overflow.top - overflow.bottom;
+ const maximumClippingWidth = width - overflow.left - overflow.right;
+ const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);
+ const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);
+ const noShift = !state.middlewareData.shift;
+ let availableHeight = overflowAvailableHeight;
+ let availableWidth = overflowAvailableWidth;
+ if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {
+ availableWidth = maximumClippingWidth;
+ }
+ if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {
+ availableHeight = maximumClippingHeight;
+ }
+ if (noShift && !alignment) {
+ const xMin = max(overflow.left, 0);
+ const xMax = max(overflow.right, 0);
+ const yMin = max(overflow.top, 0);
+ const yMax = max(overflow.bottom, 0);
+ if (isYAxis) {
+ availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));
+ } else {
+ availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));
+ }
+ }
+ await apply({
+ ...state,
+ availableWidth,
+ availableHeight
+ });
+ const nextDimensions = await platform.getDimensions(elements.floating);
+ if (width !== nextDimensions.width || height !== nextDimensions.height) {
+ return {
+ reset: {
+ rects: true
+ }
+ };
+ }
+ return {};
+ }
+ };
+};
+
+export { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };
diff --git a/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs b/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs
new file mode 100644
index 0000000..2c1ccbb
--- /dev/null
+++ b/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs
@@ -0,0 +1,759 @@
+import { rectToClientRect, arrow as arrow$1, autoPlacement as autoPlacement$1, detectOverflow as detectOverflow$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1, computePosition as computePosition$1 } from '@floating-ui/core';
+import { round, createCoords, max, min, floor } from '@floating-ui/utils';
+import { getComputedStyle, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';
+export { getOverflowAncestors } from '@floating-ui/utils/dom';
+
+function getCssDimensions(element) {
+ const css = getComputedStyle(element);
+ // In testing environments, the `width` and `height` properties are empty
+ // strings for SVG elements, returning NaN. Fallback to `0` in this case.
+ let width = parseFloat(css.width) || 0;
+ let height = parseFloat(css.height) || 0;
+ const hasOffset = isHTMLElement(element);
+ const offsetWidth = hasOffset ? element.offsetWidth : width;
+ const offsetHeight = hasOffset ? element.offsetHeight : height;
+ const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;
+ if (shouldFallback) {
+ width = offsetWidth;
+ height = offsetHeight;
+ }
+ return {
+ width,
+ height,
+ $: shouldFallback
+ };
+}
+
+function unwrapElement(element) {
+ return !isElement(element) ? element.contextElement : element;
+}
+
+function getScale(element) {
+ const domElement = unwrapElement(element);
+ if (!isHTMLElement(domElement)) {
+ return createCoords(1);
+ }
+ const rect = domElement.getBoundingClientRect();
+ const {
+ width,
+ height,
+ $
+ } = getCssDimensions(domElement);
+ let x = ($ ? round(rect.width) : rect.width) / width;
+ let y = ($ ? round(rect.height) : rect.height) / height;
+
+ // 0, NaN, or Infinity should always fallback to 1.
+
+ if (!x || !Number.isFinite(x)) {
+ x = 1;
+ }
+ if (!y || !Number.isFinite(y)) {
+ y = 1;
+ }
+ return {
+ x,
+ y
+ };
+}
+
+const noOffsets = /*#__PURE__*/createCoords(0);
+function getVisualOffsets(element) {
+ const win = getWindow(element);
+ if (!isWebKit() || !win.visualViewport) {
+ return noOffsets;
+ }
+ return {
+ x: win.visualViewport.offsetLeft,
+ y: win.visualViewport.offsetTop
+ };
+}
+function shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {
+ if (isFixed === void 0) {
+ isFixed = false;
+ }
+ if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {
+ return false;
+ }
+ return isFixed;
+}
+
+function getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {
+ if (includeScale === void 0) {
+ includeScale = false;
+ }
+ if (isFixedStrategy === void 0) {
+ isFixedStrategy = false;
+ }
+ const clientRect = element.getBoundingClientRect();
+ const domElement = unwrapElement(element);
+ let scale = createCoords(1);
+ if (includeScale) {
+ if (offsetParent) {
+ if (isElement(offsetParent)) {
+ scale = getScale(offsetParent);
+ }
+ } else {
+ scale = getScale(element);
+ }
+ }
+ const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);
+ let x = (clientRect.left + visualOffsets.x) / scale.x;
+ let y = (clientRect.top + visualOffsets.y) / scale.y;
+ let width = clientRect.width / scale.x;
+ let height = clientRect.height / scale.y;
+ if (domElement) {
+ const win = getWindow(domElement);
+ const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;
+ let currentWin = win;
+ let currentIFrame = getFrameElement(currentWin);
+ while (currentIFrame && offsetParent && offsetWin !== currentWin) {
+ const iframeScale = getScale(currentIFrame);
+ const iframeRect = currentIFrame.getBoundingClientRect();
+ const css = getComputedStyle(currentIFrame);
+ const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;
+ const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;
+ x *= iframeScale.x;
+ y *= iframeScale.y;
+ width *= iframeScale.x;
+ height *= iframeScale.y;
+ x += left;
+ y += top;
+ currentWin = getWindow(currentIFrame);
+ currentIFrame = getFrameElement(currentWin);
+ }
+ }
+ return rectToClientRect({
+ width,
+ height,
+ x,
+ y
+ });
+}
+
+// If <html> has a CSS width greater than the viewport, then this will be
+// incorrect for RTL.
+function getWindowScrollBarX(element, rect) {
+ const leftScroll = getNodeScroll(element).scrollLeft;
+ if (!rect) {
+ return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;
+ }
+ return rect.left + leftScroll;
+}
+
+function getHTMLOffset(documentElement, scroll, ignoreScrollbarX) {
+ if (ignoreScrollbarX === void 0) {
+ ignoreScrollbarX = false;
+ }
+ const htmlRect = documentElement.getBoundingClientRect();
+ const x = htmlRect.left + scroll.scrollLeft - (ignoreScrollbarX ? 0 :
+ // RTL <body> scrollbar.
+ getWindowScrollBarX(documentElement, htmlRect));
+ const y = htmlRect.top + scroll.scrollTop;
+ return {
+ x,
+ y
+ };
+}
+
+function convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {
+ let {
+ elements,
+ rect,
+ offsetParent,
+ strategy
+ } = _ref;
+ const isFixed = strategy === 'fixed';
+ const documentElement = getDocumentElement(offsetParent);
+ const topLayer = elements ? isTopLayer(elements.floating) : false;
+ if (offsetParent === documentElement || topLayer && isFixed) {
+ return rect;
+ }
+ let scroll = {
+ scrollLeft: 0,
+ scrollTop: 0
+ };
+ let scale = createCoords(1);
+ const offsets = createCoords(0);
+ const isOffsetParentAnElement = isHTMLElement(offsetParent);
+ if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
+ if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {
+ scroll = getNodeScroll(offsetParent);
+ }
+ if (isHTMLElement(offsetParent)) {
+ const offsetRect = getBoundingClientRect(offsetParent);
+ scale = getScale(offsetParent);
+ offsets.x = offsetRect.x + offsetParent.clientLeft;
+ offsets.y = offsetRect.y + offsetParent.clientTop;
+ }
+ }
+ const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll, true) : createCoords(0);
+ return {
+ width: rect.width * scale.x,
+ height: rect.height * scale.y,
+ x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,
+ y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y
+ };
+}
+
+function getClientRects(element) {
+ return Array.from(element.getClientRects());
+}
+
+// Gets the entire size of the scrollable document area, even extending outside
+// of the `<html>` and `<body>` rect bounds if horizontally scrollable.
+function getDocumentRect(element) {
+ const html = getDocumentElement(element);
+ const scroll = getNodeScroll(element);
+ const body = element.ownerDocument.body;
+ const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);
+ const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);
+ let x = -scroll.scrollLeft + getWindowScrollBarX(element);
+ const y = -scroll.scrollTop;
+ if (getComputedStyle(body).direction === 'rtl') {
+ x += max(html.clientWidth, body.clientWidth) - width;
+ }
+ return {
+ width,
+ height,
+ x,
+ y
+ };
+}
+
+function getViewportRect(element, strategy) {
+ const win = getWindow(element);
+ const html = getDocumentElement(element);
+ const visualViewport = win.visualViewport;
+ let width = html.clientWidth;
+ let height = html.clientHeight;
+ let x = 0;
+ let y = 0;
+ if (visualViewport) {
+ width = visualViewport.width;
+ height = visualViewport.height;
+ const visualViewportBased = isWebKit();
+ if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {
+ x = visualViewport.offsetLeft;
+ y = visualViewport.offsetTop;
+ }
+ }
+ return {
+ width,
+ height,
+ x,
+ y
+ };
+}
+
+// Returns the inner client rect, subtracting scrollbars if present.
+function getInnerBoundingClientRect(element, strategy) {
+ const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');
+ const top = clientRect.top + element.clientTop;
+ const left = clientRect.left + element.clientLeft;
+ const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);
+ const width = element.clientWidth * scale.x;
+ const height = element.clientHeight * scale.y;
+ const x = left * scale.x;
+ const y = top * scale.y;
+ return {
+ width,
+ height,
+ x,
+ y
+ };
+}
+function getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {
+ let rect;
+ if (clippingAncestor === 'viewport') {
+ rect = getViewportRect(element, strategy);
+ } else if (clippingAncestor === 'document') {
+ rect = getDocumentRect(getDocumentElement(element));
+ } else if (isElement(clippingAncestor)) {
+ rect = getInnerBoundingClientRect(clippingAncestor, strategy);
+ } else {
+ const visualOffsets = getVisualOffsets(element);
+ rect = {
+ x: clippingAncestor.x - visualOffsets.x,
+ y: clippingAncestor.y - visualOffsets.y,
+ width: clippingAncestor.width,
+ height: clippingAncestor.height
+ };
+ }
+ return rectToClientRect(rect);
+}
+function hasFixedPositionAncestor(element, stopNode) {
+ const parentNode = getParentNode(element);
+ if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {
+ return false;
+ }
+ return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);
+}
+
+// A "clipping ancestor" is an `overflow` element with the characteristic of
+// clipping (or hiding) child elements. This returns all clipping ancestors
+// of the given element up the tree.
+function getClippingElementAncestors(element, cache) {
+ const cachedResult = cache.get(element);
+ if (cachedResult) {
+ return cachedResult;
+ }
+ let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');
+ let currentContainingBlockComputedStyle = null;
+ const elementIsFixed = getComputedStyle(element).position === 'fixed';
+ let currentNode = elementIsFixed ? getParentNode(element) : element;
+
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block
+ while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {
+ const computedStyle = getComputedStyle(currentNode);
+ const currentNodeIsContaining = isContainingBlock(currentNode);
+ if (!currentNodeIsContaining && computedStyle.position === 'fixed') {
+ currentContainingBlockComputedStyle = null;
+ }
+ const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && ['absolute', 'fixed'].includes(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);
+ if (shouldDropCurrentNode) {
+ // Drop non-containing blocks.
+ result = result.filter(ancestor => ancestor !== currentNode);
+ } else {
+ // Record last containing block for next iteration.
+ currentContainingBlockComputedStyle = computedStyle;
+ }
+ currentNode = getParentNode(currentNode);
+ }
+ cache.set(element, result);
+ return result;
+}
+
+// Gets the maximum area that the element is visible in due to any number of
+// clipping ancestors.
+function getClippingRect(_ref) {
+ let {
+ element,
+ boundary,
+ rootBoundary,
+ strategy
+ } = _ref;
+ const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);
+ const clippingAncestors = [...elementClippingAncestors, rootBoundary];
+ const firstClippingAncestor = clippingAncestors[0];
+ const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {
+ const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);
+ accRect.top = max(rect.top, accRect.top);
+ accRect.right = min(rect.right, accRect.right);
+ accRect.bottom = min(rect.bottom, accRect.bottom);
+ accRect.left = max(rect.left, accRect.left);
+ return accRect;
+ }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));
+ return {
+ width: clippingRect.right - clippingRect.left,
+ height: clippingRect.bottom - clippingRect.top,
+ x: clippingRect.left,
+ y: clippingRect.top
+ };
+}
+
+function getDimensions(element) {
+ const {
+ width,
+ height
+ } = getCssDimensions(element);
+ return {
+ width,
+ height
+ };
+}
+
+function getRectRelativeToOffsetParent(element, offsetParent, strategy) {
+ const isOffsetParentAnElement = isHTMLElement(offsetParent);
+ const documentElement = getDocumentElement(offsetParent);
+ const isFixed = strategy === 'fixed';
+ const rect = getBoundingClientRect(element, true, isFixed, offsetParent);
+ let scroll = {
+ scrollLeft: 0,
+ scrollTop: 0
+ };
+ const offsets = createCoords(0);
+
+ // If the <body> scrollbar appears on the left (e.g. RTL systems). Use
+ // Firefox with layout.scrollbar.side = 3 in about:config to test this.
+ function setLeftRTLScrollbarOffset() {
+ offsets.x = getWindowScrollBarX(documentElement);
+ }
+ if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
+ if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {
+ scroll = getNodeScroll(offsetParent);
+ }
+ if (isOffsetParentAnElement) {
+ const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);
+ offsets.x = offsetRect.x + offsetParent.clientLeft;
+ offsets.y = offsetRect.y + offsetParent.clientTop;
+ } else if (documentElement) {
+ setLeftRTLScrollbarOffset();
+ }
+ }
+ if (isFixed && !isOffsetParentAnElement && documentElement) {
+ setLeftRTLScrollbarOffset();
+ }
+ const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);
+ const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;
+ const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;
+ return {
+ x,
+ y,
+ width: rect.width,
+ height: rect.height
+ };
+}
+
+function isStaticPositioned(element) {
+ return getComputedStyle(element).position === 'static';
+}
+
+function getTrueOffsetParent(element, polyfill) {
+ if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {
+ return null;
+ }
+ if (polyfill) {
+ return polyfill(element);
+ }
+ let rawOffsetParent = element.offsetParent;
+
+ // Firefox returns the <html> element as the offsetParent if it's non-static,
+ // while Chrome and Safari return the <body> element. The <body> element must
+ // be used to perform the correct calculations even if the <html> element is
+ // non-static.
+ if (getDocumentElement(element) === rawOffsetParent) {
+ rawOffsetParent = rawOffsetParent.ownerDocument.body;
+ }
+ return rawOffsetParent;
+}
+
+// Gets the closest ancestor positioned element. Handles some edge cases,
+// such as table ancestors and cross browser bugs.
+function getOffsetParent(element, polyfill) {
+ const win = getWindow(element);
+ if (isTopLayer(element)) {
+ return win;
+ }
+ if (!isHTMLElement(element)) {
+ let svgOffsetParent = getParentNode(element);
+ while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {
+ if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {
+ return svgOffsetParent;
+ }
+ svgOffsetParent = getParentNode(svgOffsetParent);
+ }
+ return win;
+ }
+ let offsetParent = getTrueOffsetParent(element, polyfill);
+ while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {
+ offsetParent = getTrueOffsetParent(offsetParent, polyfill);
+ }
+ if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {
+ return win;
+ }
+ return offsetParent || getContainingBlock(element) || win;
+}
+
+const getElementRects = async function (data) {
+ const getOffsetParentFn = this.getOffsetParent || getOffsetParent;
+ const getDimensionsFn = this.getDimensions;
+ const floatingDimensions = await getDimensionsFn(data.floating);
+ return {
+ reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),
+ floating: {
+ x: 0,
+ y: 0,
+ width: floatingDimensions.width,
+ height: floatingDimensions.height
+ }
+ };
+};
+
+function isRTL(element) {
+ return getComputedStyle(element).direction === 'rtl';
+}
+
+const platform = {
+ convertOffsetParentRelativeRectToViewportRelativeRect,
+ getDocumentElement,
+ getClippingRect,
+ getOffsetParent,
+ getElementRects,
+ getClientRects,
+ getDimensions,
+ getScale,
+ isElement,
+ isRTL
+};
+
+function rectsAreEqual(a, b) {
+ return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;
+}
+
+// https://samthor.au/2021/observing-dom/
+function observeMove(element, onMove) {
+ let io = null;
+ let timeoutId;
+ const root = getDocumentElement(element);
+ function cleanup() {
+ var _io;
+ clearTimeout(timeoutId);
+ (_io = io) == null || _io.disconnect();
+ io = null;
+ }
+ function refresh(skip, threshold) {
+ if (skip === void 0) {
+ skip = false;
+ }
+ if (threshold === void 0) {
+ threshold = 1;
+ }
+ cleanup();
+ const elementRectForRootMargin = element.getBoundingClientRect();
+ const {
+ left,
+ top,
+ width,
+ height
+ } = elementRectForRootMargin;
+ if (!skip) {
+ onMove();
+ }
+ if (!width || !height) {
+ return;
+ }
+ const insetTop = floor(top);
+ const insetRight = floor(root.clientWidth - (left + width));
+ const insetBottom = floor(root.clientHeight - (top + height));
+ const insetLeft = floor(left);
+ const rootMargin = -insetTop + "px " + -insetRight + "px " + -insetBottom + "px " + -insetLeft + "px";
+ const options = {
+ rootMargin,
+ threshold: max(0, min(1, threshold)) || 1
+ };
+ let isFirstUpdate = true;
+ function handleObserve(entries) {
+ const ratio = entries[0].intersectionRatio;
+ if (ratio !== threshold) {
+ if (!isFirstUpdate) {
+ return refresh();
+ }
+ if (!ratio) {
+ // If the reference is clipped, the ratio is 0. Throttle the refresh
+ // to prevent an infinite loop of updates.
+ timeoutId = setTimeout(() => {
+ refresh(false, 1e-7);
+ }, 1000);
+ } else {
+ refresh(false, ratio);
+ }
+ }
+ if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {
+ // It's possible that even though the ratio is reported as 1, the
+ // element is not actually fully within the IntersectionObserver's root
+ // area anymore. This can happen under performance constraints. This may
+ // be a bug in the browser's IntersectionObserver implementation. To
+ // work around this, we compare the element's bounding rect now with
+ // what it was at the time we created the IntersectionObserver. If they
+ // are not equal then the element moved, so we refresh.
+ refresh();
+ }
+ isFirstUpdate = false;
+ }
+
+ // Older browsers don't support a `document` as the root and will throw an
+ // error.
+ try {
+ io = new IntersectionObserver(handleObserve, {
+ ...options,
+ // Handle <iframe>s
+ root: root.ownerDocument
+ });
+ } catch (_e) {
+ io = new IntersectionObserver(handleObserve, options);
+ }
+ io.observe(element);
+ }
+ refresh(true);
+ return cleanup;
+}
+
+/**
+ * Automatically updates the position of the floating element when necessary.
+ * Should only be called when the floating element is mounted on the DOM or
+ * visible on the screen.
+ * @returns cleanup function that should be invoked when the floating element is
+ * removed from the DOM or hidden from the screen.
+ * @see https://floating-ui.com/docs/autoUpdate
+ */
+function autoUpdate(reference, floating, update, options) {
+ if (options === void 0) {
+ options = {};
+ }
+ const {
+ ancestorScroll = true,
+ ancestorResize = true,
+ elementResize = typeof ResizeObserver === 'function',
+ layoutShift = typeof IntersectionObserver === 'function',
+ animationFrame = false
+ } = options;
+ const referenceEl = unwrapElement(reference);
+ const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];
+ ancestors.forEach(ancestor => {
+ ancestorScroll && ancestor.addEventListener('scroll', update, {
+ passive: true
+ });
+ ancestorResize && ancestor.addEventListener('resize', update);
+ });
+ const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;
+ let reobserveFrame = -1;
+ let resizeObserver = null;
+ if (elementResize) {
+ resizeObserver = new ResizeObserver(_ref => {
+ let [firstEntry] = _ref;
+ if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {
+ // Prevent update loops when using the `size` middleware.
+ // https://github.com/floating-ui/floating-ui/issues/1740
+ resizeObserver.unobserve(floating);
+ cancelAnimationFrame(reobserveFrame);
+ reobserveFrame = requestAnimationFrame(() => {
+ var _resizeObserver;
+ (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);
+ });
+ }
+ update();
+ });
+ if (referenceEl && !animationFrame) {
+ resizeObserver.observe(referenceEl);
+ }
+ resizeObserver.observe(floating);
+ }
+ let frameId;
+ let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;
+ if (animationFrame) {
+ frameLoop();
+ }
+ function frameLoop() {
+ const nextRefRect = getBoundingClientRect(reference);
+ if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {
+ update();
+ }
+ prevRefRect = nextRefRect;
+ frameId = requestAnimationFrame(frameLoop);
+ }
+ update();
+ return () => {
+ var _resizeObserver2;
+ ancestors.forEach(ancestor => {
+ ancestorScroll && ancestor.removeEventListener('scroll', update);
+ ancestorResize && ancestor.removeEventListener('resize', update);
+ });
+ cleanupIo == null || cleanupIo();
+ (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();
+ resizeObserver = null;
+ if (animationFrame) {
+ cancelAnimationFrame(frameId);
+ }
+ };
+}
+
+/**
+ * Resolves with an object of overflow side offsets that determine how much the
+ * element is overflowing a given clipping boundary on each side.
+ * - positive = overflowing the boundary by that number of pixels
+ * - negative = how many pixels left before it will overflow
+ * - 0 = lies flush with the boundary
+ * @see https://floating-ui.com/docs/detectOverflow
+ */
+const detectOverflow = detectOverflow$1;
+
+/**
+ * Modifies the placement by translating the floating element along the
+ * specified axes.
+ * A number (shorthand for `mainAxis` or distance), or an axes configuration
+ * object may be passed.
+ * @see https://floating-ui.com/docs/offset
+ */
+const offset = offset$1;
+
+/**
+ * Optimizes the visibility of the floating element by choosing the placement
+ * that has the most space available automatically, without needing to specify a
+ * preferred placement. Alternative to `flip`.
+ * @see https://floating-ui.com/docs/autoPlacement
+ */
+const autoPlacement = autoPlacement$1;
+
+/**
+ * Optimizes the visibility of the floating element by shifting it in order to
+ * keep it in view when it will overflow the clipping boundary.
+ * @see https://floating-ui.com/docs/shift
+ */
+const shift = shift$1;
+
+/**
+ * Optimizes the visibility of the floating element by flipping the `placement`
+ * in order to keep it in view when the preferred placement(s) will overflow the
+ * clipping boundary. Alternative to `autoPlacement`.
+ * @see https://floating-ui.com/docs/flip
+ */
+const flip = flip$1;
+
+/**
+ * Provides data that allows you to change the size of the floating element —
+ * for instance, prevent it from overflowing the clipping boundary or match the
+ * width of the reference element.
+ * @see https://floating-ui.com/docs/size
+ */
+const size = size$1;
+
+/**
+ * Provides data to hide the floating element in applicable situations, such as
+ * when it is not in the same clipping context as the reference element.
+ * @see https://floating-ui.com/docs/hide
+ */
+const hide = hide$1;
+
+/**
+ * Provides data to position an inner element of the floating element so that it
+ * appears centered to the reference element.
+ * @see https://floating-ui.com/docs/arrow
+ */
+const arrow = arrow$1;
+
+/**
+ * Provides improved positioning for inline reference elements that can span
+ * over multiple lines, such as hyperlinks or range selections.
+ * @see https://floating-ui.com/docs/inline
+ */
+const inline = inline$1;
+
+/**
+ * Built-in `limiter` that will stop `shift()` at a certain point.
+ */
+const limitShift = limitShift$1;
+
+/**
+ * Computes the `x` and `y` coordinates that will place the floating element
+ * next to a given reference element.
+ */
+const computePosition = (reference, floating, options) => {
+ // This caches the expensive `getClippingElementAncestors` function so that
+ // multiple lifecycle resets re-use the same result. It only lives for a
+ // single call. If other functions become expensive, we can add them as well.
+ const cache = new Map();
+ const mergedOptions = {
+ platform,
+ ...options
+ };
+ const platformWithCache = {
+ ...mergedOptions.platform,
+ _c: cache
+ };
+ return computePosition$1(reference, floating, {
+ ...mergedOptions,
+ platform: platformWithCache
+ });
+};
+
+export { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };
diff --git a/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs b/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs
new file mode 100644
index 0000000..b761182
--- /dev/null
+++ b/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs
@@ -0,0 +1,154 @@
+function hasWindow() {
+ return typeof window !== 'undefined';
+}
+function getNodeName(node) {
+ if (isNode(node)) {
+ return (node.nodeName || '').toLowerCase();
+ }
+ // Mocked nodes in testing environments may not be instances of Node. By
+ // returning `#document` an infinite loop won't occur.
+ // https://github.com/floating-ui/floating-ui/issues/2317
+ return '#document';
+}
+function getWindow(node) {
+ var _node$ownerDocument;
+ return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;
+}
+function getDocumentElement(node) {
+ var _ref;
+ return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;
+}
+function isNode(value) {
+ if (!hasWindow()) {
+ return false;
+ }
+ return value instanceof Node || value instanceof getWindow(value).Node;
+}
+function isElement(value) {
+ if (!hasWindow()) {
+ return false;
+ }
+ return value instanceof Element || value instanceof getWindow(value).Element;
+}
+function isHTMLElement(value) {
+ if (!hasWindow()) {
+ return false;
+ }
+ return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;
+}
+function isShadowRoot(value) {
+ if (!hasWindow() || typeof ShadowRoot === 'undefined') {
+ return false;
+ }
+ return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;
+}
+function isOverflowElement(element) {
+ const {
+ overflow,
+ overflowX,
+ overflowY,
+ display
+ } = getComputedStyle(element);
+ return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !['inline', 'contents'].includes(display);
+}
+function isTableElement(element) {
+ return ['table', 'td', 'th'].includes(getNodeName(element));
+}
+function isTopLayer(element) {
+ return [':popover-open', ':modal'].some(selector => {
+ try {
+ return element.matches(selector);
+ } catch (e) {
+ return false;
+ }
+ });
+}
+function isContainingBlock(elementOrCss) {
+ const webkit = isWebKit();
+ const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;
+
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block
+ // https://drafts.csswg.org/css-transforms-2/#individual-transforms
+ return ['transform', 'translate', 'scale', 'rotate', 'perspective'].some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'].some(value => (css.willChange || '').includes(value)) || ['paint', 'layout', 'strict', 'content'].some(value => (css.contain || '').includes(value));
+}
+function getContainingBlock(element) {
+ let currentNode = getParentNode(element);
+ while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {
+ if (isContainingBlock(currentNode)) {
+ return currentNode;
+ } else if (isTopLayer(currentNode)) {
+ return null;
+ }
+ currentNode = getParentNode(currentNode);
+ }
+ return null;
+}
+function isWebKit() {
+ if (typeof CSS === 'undefined' || !CSS.supports) return false;
+ return CSS.supports('-webkit-backdrop-filter', 'none');
+}
+function isLastTraversableNode(node) {
+ return ['html', 'body', '#document'].includes(getNodeName(node));
+}
+function getComputedStyle(element) {
+ return getWindow(element).getComputedStyle(element);
+}
+function getNodeScroll(element) {
+ if (isElement(element)) {
+ return {
+ scrollLeft: element.scrollLeft,
+ scrollTop: element.scrollTop
+ };
+ }
+ return {
+ scrollLeft: element.scrollX,
+ scrollTop: element.scrollY
+ };
+}
+function getParentNode(node) {
+ if (getNodeName(node) === 'html') {
+ return node;
+ }
+ const result =
+ // Step into the shadow DOM of the parent of a slotted node.
+ node.assignedSlot ||
+ // DOM Element detected.
+ node.parentNode ||
+ // ShadowRoot detected.
+ isShadowRoot(node) && node.host ||
+ // Fallback.
+ getDocumentElement(node);
+ return isShadowRoot(result) ? result.host : result;
+}
+function getNearestOverflowAncestor(node) {
+ const parentNode = getParentNode(node);
+ if (isLastTraversableNode(parentNode)) {
+ return node.ownerDocument ? node.ownerDocument.body : node.body;
+ }
+ if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {
+ return parentNode;
+ }
+ return getNearestOverflowAncestor(parentNode);
+}
+function getOverflowAncestors(node, list, traverseIframes) {
+ var _node$ownerDocument2;
+ if (list === void 0) {
+ list = [];
+ }
+ if (traverseIframes === void 0) {
+ traverseIframes = true;
+ }
+ const scrollableAncestor = getNearestOverflowAncestor(node);
+ const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);
+ const win = getWindow(scrollableAncestor);
+ if (isBody) {
+ const frameElement = getFrameElement(win);
+ return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);
+ }
+ return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));
+}
+function getFrameElement(win) {
+ return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;
+}
+
+export { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };
diff --git a/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs b/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs
new file mode 100644
index 0000000..4812430
--- /dev/null
+++ b/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs
@@ -0,0 +1,138 @@
+/**
+ * Custom positioning reference element.
+ * @see https://floating-ui.com/docs/virtual-elements
+ */
+
+const sides = ['top', 'right', 'bottom', 'left'];
+const alignments = ['start', 'end'];
+const placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + "-" + alignments[0], side + "-" + alignments[1]), []);
+const min = Math.min;
+const max = Math.max;
+const round = Math.round;
+const floor = Math.floor;
+const createCoords = v => ({
+ x: v,
+ y: v
+});
+const oppositeSideMap = {
+ left: 'right',
+ right: 'left',
+ bottom: 'top',
+ top: 'bottom'
+};
+const oppositeAlignmentMap = {
+ start: 'end',
+ end: 'start'
+};
+function clamp(start, value, end) {
+ return max(start, min(value, end));
+}
+function evaluate(value, param) {
+ return typeof value === 'function' ? value(param) : value;
+}
+function getSide(placement) {
+ return placement.split('-')[0];
+}
+function getAlignment(placement) {
+ return placement.split('-')[1];
+}
+function getOppositeAxis(axis) {
+ return axis === 'x' ? 'y' : 'x';
+}
+function getAxisLength(axis) {
+ return axis === 'y' ? 'height' : 'width';
+}
+function getSideAxis(placement) {
+ return ['top', 'bottom'].includes(getSide(placement)) ? 'y' : 'x';
+}
+function getAlignmentAxis(placement) {
+ return getOppositeAxis(getSideAxis(placement));
+}
+function getAlignmentSides(placement, rects, rtl) {
+ if (rtl === void 0) {
+ rtl = false;
+ }
+ const alignment = getAlignment(placement);
+ const alignmentAxis = getAlignmentAxis(placement);
+ const length = getAxisLength(alignmentAxis);
+ let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';
+ if (rects.reference[length] > rects.floating[length]) {
+ mainAlignmentSide = getOppositePlacement(mainAlignmentSide);
+ }
+ return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];
+}
+function getExpandedPlacements(placement) {
+ const oppositePlacement = getOppositePlacement(placement);
+ return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];
+}
+function getOppositeAlignmentPlacement(placement) {
+ return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);
+}
+function getSideList(side, isStart, rtl) {
+ const lr = ['left', 'right'];
+ const rl = ['right', 'left'];
+ const tb = ['top', 'bottom'];
+ const bt = ['bottom', 'top'];
+ switch (side) {
+ case 'top':
+ case 'bottom':
+ if (rtl) return isStart ? rl : lr;
+ return isStart ? lr : rl;
+ case 'left':
+ case 'right':
+ return isStart ? tb : bt;
+ default:
+ return [];
+ }
+}
+function getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {
+ const alignment = getAlignment(placement);
+ let list = getSideList(getSide(placement), direction === 'start', rtl);
+ if (alignment) {
+ list = list.map(side => side + "-" + alignment);
+ if (flipAlignment) {
+ list = list.concat(list.map(getOppositeAlignmentPlacement));
+ }
+ }
+ return list;
+}
+function getOppositePlacement(placement) {
+ return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);
+}
+function expandPaddingObject(padding) {
+ return {
+ top: 0,
+ right: 0,
+ bottom: 0,
+ left: 0,
+ ...padding
+ };
+}
+function getPaddingObject(padding) {
+ return typeof padding !== 'number' ? expandPaddingObject(padding) : {
+ top: padding,
+ right: padding,
+ bottom: padding,
+ left: padding
+ };
+}
+function rectToClientRect(rect) {
+ const {
+ x,
+ y,
+ width,
+ height
+ } = rect;
+ return {
+ width,
+ height,
+ top: y,
+ left: x,
+ right: x + width,
+ bottom: y + height,
+ x,
+ y
+ };
+}
+
+export { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };