{"version":3,"file":"get-clipping-rect.mjs","sources":["../../../../../../../packages/hooks/use-floating/dom/platform/get-clipping-rect.ts"],"sourcesContent":["import { concat } from 'lodash-unified'\nimport {\n  createCoords,\n  max,\n  min,\n  rectToClientRect,\n} from '@vuesax-alpha/hooks/use-floating/utils'\nimport {\n  getComputedStyle,\n  getDocumentElement,\n  getNodeName,\n  getOverflowAncestors,\n  getParentNode,\n  isContainingBlock,\n  isHTMLElement,\n  isLastTraversableNode,\n  isOverflowElement,\n} from '@vuesax-alpha/hooks/use-floating/utils/dom'\n\nimport { getBoundingClientRect } from '../utils/get-bounding-client-rect'\nimport { getDocumentRect } from '../utils/get-document-rect'\nimport { getViewportRect } from '../utils/get-viewport-rect'\nimport { getVisualOffsets } from '../utils/get-visual-offsets'\nimport { getScale } from './get-scale'\nimport { isElement } from './is-element'\nimport type {\n  ClientRectObject,\n  Rect,\n  Strategy,\n} from '@vuesax-alpha/hooks/use-floating/utils'\nimport type { Platform, ReferenceElement } from '../types'\nimport type {\n  Boundary,\n  RootBoundary,\n} from '@vuesax-alpha/hooks/use-floating/core'\n\ntype PlatformWithCache = Platform & {\n  _c: Map<ReferenceElement, Element[]>\n}\n\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(\n  element: Element,\n  strategy: Strategy\n): Rect {\n  const clientRect = getBoundingClientRect(element, true, strategy === 'fixed')\n  const top = clientRect.top + element.clientTop\n  const left = clientRect.left + element.clientLeft\n  const scale = isHTMLElement(element) ? getScale(element) : createCoords(1)\n  const width = element.clientWidth * scale.x\n  const height = element.clientHeight * scale.y\n  const x = left * scale.x\n  const y = top * scale.y\n\n  return {\n    width,\n    height,\n    x,\n    y,\n  }\n}\n\nfunction getClientRectFromClippingAncestor(\n  element: Element,\n  clippingAncestor: Element | RootBoundary,\n  strategy: Strategy\n): ClientRectObject {\n  let rect: Rect\n\n  if (clippingAncestor === 'viewport') {\n    rect = getViewportRect(element, strategy)\n  } else if (clippingAncestor === 'document') {\n    rect = getDocumentRect(getDocumentElement(element))\n  } else if (isElement(clippingAncestor)) {\n    rect = getInnerBoundingClientRect(clippingAncestor, strategy)\n  } else {\n    const visualOffsets = getVisualOffsets(element)\n    rect = {\n      ...clippingAncestor,\n      x: clippingAncestor.x - visualOffsets.x,\n      y: clippingAncestor.y - visualOffsets.y,\n    }\n  }\n\n  return rectToClientRect(rect)\n}\n\nfunction hasFixedPositionAncestor(element: Element, stopNode: Node): boolean {\n  const parentNode = getParentNode(element)\n  if (\n    parentNode === stopNode ||\n    !isElement(parentNode) ||\n    isLastTraversableNode(parentNode)\n  ) {\n    return false\n  }\n\n  return (\n    getComputedStyle(parentNode).position === 'fixed' ||\n    hasFixedPositionAncestor(parentNode, stopNode)\n  )\n}\n\nfunction getClippingElementAncestors(\n  element: Element,\n  cache: PlatformWithCache['_c']\n): Array<Element> {\n  const cachedResult = cache?.get(element)\n  if (cachedResult) {\n    return cachedResult\n  }\n\n  let result = getOverflowAncestors(element, [], false).filter(\n    (el) => isElement(el) && getNodeName(el) !== 'body'\n  ) as Array<Element>\n  let currentContainingBlockComputedStyle: CSSStyleDeclaration | null = null\n  const elementIsFixed = getComputedStyle(element).position === 'fixed'\n  let currentNode: Node | null = elementIsFixed\n    ? getParentNode(element)\n    : element\n\n  while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n    const computedStyle = getComputedStyle(currentNode)\n    const currentNodeIsContaining = isContainingBlock(currentNode)\n\n    if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n      currentContainingBlockComputedStyle = null\n    }\n\n    const shouldDropCurrentNode = elementIsFixed\n      ? !currentNodeIsContaining && !currentContainingBlockComputedStyle\n      : (!currentNodeIsContaining &&\n          computedStyle.position === 'static' &&\n          !!currentContainingBlockComputedStyle &&\n          ['absolute', 'fixed'].includes(\n            currentContainingBlockComputedStyle.position\n          )) ||\n        (isOverflowElement(currentNode) &&\n          !currentNodeIsContaining &&\n          hasFixedPositionAncestor(element, currentNode))\n\n    if (shouldDropCurrentNode) {\n      // Drop non-containing blocks.\n      result = result.filter((ancestor) => ancestor !== currentNode)\n    } else {\n      // Record last containing block for next iteration.\n      currentContainingBlockComputedStyle = computedStyle\n    }\n\n    currentNode = getParentNode(currentNode)\n  }\n\n  cache?.set(element, result)\n\n  return result\n}\n\nexport function getClippingRect(\n  this: PlatformWithCache,\n  {\n    element,\n    boundary,\n    rootBoundary,\n    strategy,\n  }: {\n    element: Element\n    boundary: Boundary\n    rootBoundary: RootBoundary\n    strategy: Strategy\n  }\n): Rect {\n  const elementClippingAncestors =\n    boundary === 'clippingAncestors'\n      ? getClippingElementAncestors(element, this._c)\n      : concat([], boundary)\n  const clippingAncestors = [...elementClippingAncestors, rootBoundary]\n  const firstClippingAncestor = clippingAncestors[0]\n\n  const clippingRect = clippingAncestors.reduce(\n    (accRect: ClientRectObject, clippingAncestor) => {\n      const rect = getClientRectFromClippingAncestor(\n        element,\n        clippingAncestor,\n        strategy\n      )\n\n      accRect.top = max(rect.top, accRect.top)\n      accRect.right = min(rect.right, accRect.right)\n      accRect.bottom = min(rect.bottom, accRect.bottom)\n      accRect.left = max(rect.left, accRect.left)\n\n      return accRect\n    },\n    getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy)\n  )\n\n  return {\n    width: clippingRect.right - clippingRect.left,\n    height: clippingRect.bottom - clippingRect.top,\n    x: clippingRect.left,\n    y: clippingRect.top,\n  }\n}\n"],"names":[],"mappings":"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"}