UNPKG

@vuesax-alpha/nightly

Version:
1 lines 10.4 kB
{"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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"}