{"version":3,"file":"flip.mjs","sources":["../../../../../../../packages/hooks/use-floating/core/middleware/flip.ts"],"sourcesContent":["import {\n  evaluate,\n  getAlignmentSides,\n  getExpandedPlacements,\n  getOppositeAxisPlacements,\n  getOppositePlacement,\n  getSide,\n} from '../../utils'\nimport { detectOverflow } from '../detect-overflow'\nimport type { DetectOverflowOptions } from '../detect-overflow'\nimport type { Derivable, Middleware } from '../types'\nimport type { Placement } from '../../utils'\n\nexport type FlipOptions = Partial<\n  DetectOverflowOptions & {\n    /**\n     * @default true\n     */\n    mainAxis: boolean\n\n    /**\n     * @default true\n     */\n    crossAxis: boolean\n\n    /**\n     * @default [oppositePlacement] (computed)\n     */\n    fallbackPlacements: Array<Placement>\n\n    /**\n     * @default 'bestFit'\n     */\n    fallbackStrategy: 'bestFit' | 'initialPlacement'\n\n    /**\n     * @default 'none' (disallow fallback)\n     */\n    fallbackAxisSideDirection: 'none' | 'start' | 'end'\n\n    /**\n     * @default true\n     */\n    flipAlignment: boolean\n  }\n>\n\nexport const flip = (\n  options: FlipOptions | Derivable<FlipOptions> = {}\n): Middleware => ({\n  name: 'flip',\n  options,\n  async fn(state) {\n    const {\n      placement,\n      middlewareData,\n      rects,\n      initialPlacement,\n      platform,\n      elements,\n    } = state\n\n    const {\n      mainAxis: checkMainAxis = true,\n      crossAxis: checkCrossAxis = true,\n      fallbackPlacements: specifiedFallbackPlacements,\n      fallbackStrategy = 'bestFit',\n      fallbackAxisSideDirection = 'none',\n      flipAlignment = true,\n      ...detectOverflowOptions\n    } = evaluate(options, state)\n\n    if (middlewareData.arrow?.alignmentOffset) {\n      return {}\n    }\n\n    const side = getSide(placement)\n    const isBasePlacement = getSide(initialPlacement) === initialPlacement\n    const rtl = await platform.isRTL?.(elements.floating)\n\n    const fallbackPlacements =\n      specifiedFallbackPlacements ||\n      (isBasePlacement || !flipAlignment\n        ? [getOppositePlacement(initialPlacement)]\n        : getExpandedPlacements(initialPlacement))\n\n    if (!specifiedFallbackPlacements && fallbackAxisSideDirection !== 'none') {\n      fallbackPlacements.push(\n        ...getOppositeAxisPlacements(\n          initialPlacement,\n          flipAlignment,\n          fallbackAxisSideDirection,\n          rtl\n        )\n      )\n    }\n\n    const placements = [initialPlacement, ...fallbackPlacements]\n\n    const overflow = await detectOverflow(state, detectOverflowOptions)\n\n    const overflows: number[] = []\n    let overflowsData = middlewareData.flip?.overflows || []\n\n    if (checkMainAxis) {\n      overflows.push(overflow[side])\n    }\n\n    if (checkCrossAxis) {\n      const sides = getAlignmentSides(placement, rects, rtl)\n      overflows.push(overflow[sides[0]], overflow[sides[1]])\n    }\n\n    overflowsData = [...overflowsData, { placement, overflows }]\n\n    if (!overflows.every((side) => side <= 0)) {\n      const nextIndex = (middlewareData.flip?.index || 0) + 1\n      const nextPlacement = placements[nextIndex]\n\n      if (nextPlacement) {\n        return {\n          data: {\n            index: nextIndex,\n            overflows: overflowsData,\n          },\n          reset: {\n            placement: nextPlacement,\n          },\n        }\n      }\n\n      let resetPlacement = overflowsData\n        .filter((d) => d.overflows[0] <= 0)\n        .sort((a, b) => a.overflows[1] - b.overflows[1])[0]?.placement\n\n      if (!resetPlacement) {\n        switch (fallbackStrategy) {\n          case 'bestFit': {\n            const placement = overflowsData\n              .map(\n                (d) =>\n                  [\n                    d.placement,\n                    d.overflows\n                      .filter((overflow) => overflow > 0)\n                      .reduce((acc, overflow) => acc + overflow, 0),\n                  ] as const\n              )\n              .sort((a, b) => a[1] - b[1])[0]?.[0]\n            if (placement) {\n              resetPlacement = placement\n            }\n            break\n          }\n          case 'initialPlacement':\n            resetPlacement = initialPlacement\n            break\n          default:\n        }\n      }\n\n      if (placement !== resetPlacement) {\n        return {\n          reset: {\n            placement: resetPlacement,\n          },\n        }\n      }\n    }\n\n    return {}\n  },\n})\n"],"names":["side","placement","overflow"],"mappings":"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"}