{"version":3,"file":"shift.mjs","sources":["../../../../../../../packages/hooks/use-floating/core/middleware/shift.ts"],"sourcesContent":["import {\n  clamp,\n  evaluate,\n  getOppositeAxis,\n  getSide,\n  getSideAxis,\n} from '../../utils'\nimport { detectOverflow } from '../detect-overflow'\nimport type { DetectOverflowOptions } from '../detect-overflow'\nimport type { Coords } from '../../utils'\nimport type { Derivable, Middleware, MiddlewareState } from '../types'\n\nexport type ShiftOptions = Partial<\n  DetectOverflowOptions & {\n    /**\n     * @default true\n     */\n    mainAxis: boolean\n\n    /**\n     * @default false\n     */\n    crossAxis: boolean\n\n    limiter: {\n      fn: (state: MiddlewareState) => Coords\n      options?: any\n    }\n  }\n>\n\nexport const shift = (\n  options: ShiftOptions | Derivable<ShiftOptions> = {}\n): Middleware => ({\n  name: 'shift',\n  options,\n  async fn(state) {\n    const { x, y, placement } = state\n\n    const {\n      mainAxis: checkMainAxis = true,\n      crossAxis: checkCrossAxis = false,\n      limiter = { fn: ({ x, y }: Coords) => ({ x, y }) },\n      ...detectOverflowOptions\n    } = evaluate(options, state)\n\n    const coords = { x, y }\n    const overflow = await detectOverflow(state, detectOverflowOptions)\n    const crossAxis = getSideAxis(getSide(placement))\n    const mainAxis = getOppositeAxis(crossAxis)\n\n    let mainAxisCoord = coords[mainAxis]\n    let crossAxisCoord = coords[crossAxis]\n\n    if (checkMainAxis) {\n      const minSide = mainAxis === 'y' ? 'top' : 'left'\n      const maxSide = mainAxis === 'y' ? 'bottom' : 'right'\n      const min = mainAxisCoord + overflow[minSide]\n      const max = mainAxisCoord - overflow[maxSide]\n\n      mainAxisCoord = clamp(min, mainAxisCoord, max)\n    }\n\n    if (checkCrossAxis) {\n      const minSide = crossAxis === 'y' ? 'top' : 'left'\n      const maxSide = crossAxis === 'y' ? 'bottom' : 'right'\n      const min = crossAxisCoord + overflow[minSide]\n      const max = crossAxisCoord - overflow[maxSide]\n\n      crossAxisCoord = clamp(min, crossAxisCoord, max)\n    }\n\n    const limitedCoords = limiter.fn({\n      ...state,\n      [mainAxis]: mainAxisCoord,\n      [crossAxis]: crossAxisCoord,\n    })\n\n    return {\n      ...limitedCoords,\n      data: {\n        x: limitedCoords.x - x,\n        y: limitedCoords.y - y,\n      },\n    }\n  },\n})\n\ntype LimitShiftOffset =\n  | number\n  | Partial<{\n      mainAxis: number\n\n      crossAxis: number\n    }>\n\nexport type LimitShiftOptions = Partial<{\n  offset: LimitShiftOffset | Derivable<LimitShiftOffset>\n\n  mainAxis: boolean\n\n  crossAxis: boolean\n}>\n\nexport const limitShift = (\n  options: LimitShiftOptions | Derivable<LimitShiftOptions> = {}\n): {\n  options: any\n  fn: (state: MiddlewareState) => Coords\n} => ({\n  options,\n  fn(state) {\n    const { x, y, placement, rects, middlewareData } = state\n\n    const {\n      offset = 0,\n      mainAxis: checkMainAxis = true,\n      crossAxis: checkCrossAxis = true,\n    } = evaluate(options, state)\n\n    const coords = { x, y }\n    const crossAxis = getSideAxis(placement)\n    const mainAxis = getOppositeAxis(crossAxis)\n\n    let mainAxisCoord = coords[mainAxis]\n    let crossAxisCoord = coords[crossAxis]\n\n    const rawOffset = evaluate(offset, state)\n    const computedOffset =\n      typeof rawOffset === 'number'\n        ? { mainAxis: rawOffset, crossAxis: 0 }\n        : { mainAxis: 0, crossAxis: 0, ...rawOffset }\n\n    if (checkMainAxis) {\n      const len = mainAxis === 'y' ? 'height' : 'width'\n      const limitMin =\n        rects.reference[mainAxis] -\n        rects.floating[len] +\n        computedOffset.mainAxis\n      const limitMax =\n        rects.reference[mainAxis] +\n        rects.reference[len] -\n        computedOffset.mainAxis\n\n      if (mainAxisCoord < limitMin) {\n        mainAxisCoord = limitMin\n      } else if (mainAxisCoord > limitMax) {\n        mainAxisCoord = limitMax\n      }\n    }\n\n    if (checkCrossAxis) {\n      const len = mainAxis === 'y' ? 'width' : 'height'\n      const isOriginSide = ['top', 'left'].includes(getSide(placement))\n      const limitMin =\n        rects.reference[crossAxis] -\n        rects.floating[len] +\n        (isOriginSide ? middlewareData.offset?.[crossAxis] || 0 : 0) +\n        (isOriginSide ? 0 : computedOffset.crossAxis)\n      const limitMax =\n        rects.reference[crossAxis] +\n        rects.reference[len] +\n        (isOriginSide ? 0 : middlewareData.offset?.[crossAxis] || 0) -\n        (isOriginSide ? computedOffset.crossAxis : 0)\n\n      if (crossAxisCoord < limitMin) {\n        crossAxisCoord = limitMin\n      } else if (crossAxisCoord > limitMax) {\n        crossAxisCoord = limitMax\n      }\n    }\n\n    return {\n      [mainAxis]: mainAxisCoord,\n      [crossAxis]: crossAxisCoord,\n    } as Coords\n  },\n})\n"],"names":["x","y"],"mappings":"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"}