@wordpress/components
Version:
UI components for WordPress.
8 lines (7 loc) • 11 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../src/popover/utils.ts"],
"sourcesContent": ["/**\n * External dependencies\n */\nimport { cubicBezier } from 'framer-motion';\n/**\n * Internal dependencies\n */\nimport { DROPDOWN_MOTION } from '../utils';\nconst POSITION_TO_PLACEMENT = {\n bottom: 'bottom',\n top: 'top',\n 'middle left': 'left',\n 'middle right': 'right',\n 'bottom left': 'bottom-end',\n 'bottom center': 'bottom',\n 'bottom right': 'bottom-start',\n 'top left': 'top-end',\n 'top center': 'top',\n 'top right': 'top-start',\n 'middle left left': 'left',\n 'middle left right': 'left',\n 'middle left bottom': 'left-end',\n 'middle left top': 'left-start',\n 'middle right left': 'right',\n 'middle right right': 'right',\n 'middle right bottom': 'right-end',\n 'middle right top': 'right-start',\n 'bottom left left': 'bottom-end',\n 'bottom left right': 'bottom-end',\n 'bottom left bottom': 'bottom-end',\n 'bottom left top': 'bottom-end',\n 'bottom center left': 'bottom',\n 'bottom center right': 'bottom',\n 'bottom center bottom': 'bottom',\n 'bottom center top': 'bottom',\n 'bottom right left': 'bottom-start',\n 'bottom right right': 'bottom-start',\n 'bottom right bottom': 'bottom-start',\n 'bottom right top': 'bottom-start',\n 'top left left': 'top-end',\n 'top left right': 'top-end',\n 'top left bottom': 'top-end',\n 'top left top': 'top-end',\n 'top center left': 'top',\n 'top center right': 'top',\n 'top center bottom': 'top',\n 'top center top': 'top',\n 'top right left': 'top-start',\n 'top right right': 'top-start',\n 'top right bottom': 'top-start',\n 'top right top': 'top-start',\n // `middle`/`middle center [corner?]` positions are associated to a fallback\n // `bottom` placement because there aren't any corresponding placement values.\n middle: 'bottom',\n 'middle center': 'bottom',\n 'middle center bottom': 'bottom',\n 'middle center left': 'bottom',\n 'middle center right': 'bottom',\n 'middle center top': 'bottom'\n};\n\n/**\n * Converts the `Popover`'s legacy \"position\" prop to the new \"placement\" prop\n * (used by `floating-ui`).\n *\n * @param position The legacy position\n * @return The corresponding placement\n */\nexport const positionToPlacement = position => POSITION_TO_PLACEMENT[position] ?? 'bottom';\n\n/**\n * @typedef AnimationOrigin\n * @type {Object}\n * @property {number} originX A number between 0 and 1 (in CSS logical properties jargon, 0 is \"start\", 0.5 is \"center\", and 1 is \"end\")\n * @property {number} originY A number between 0 and 1 (0 is top, 0.5 is center, and 1 is bottom)\n */\n\nconst PLACEMENT_TO_ANIMATION_ORIGIN = {\n top: {\n originX: 0.5,\n originY: 1\n },\n // open from bottom, center\n 'top-start': {\n originX: 0,\n originY: 1\n },\n // open from bottom, left\n 'top-end': {\n originX: 1,\n originY: 1\n },\n // open from bottom, right\n right: {\n originX: 0,\n originY: 0.5\n },\n // open from middle, left\n 'right-start': {\n originX: 0,\n originY: 0\n },\n // open from top, left\n 'right-end': {\n originX: 0,\n originY: 1\n },\n // open from bottom, left\n bottom: {\n originX: 0.5,\n originY: 0\n },\n // open from top, center\n 'bottom-start': {\n originX: 0,\n originY: 0\n },\n // open from top, left\n 'bottom-end': {\n originX: 1,\n originY: 0\n },\n // open from top, right\n left: {\n originX: 1,\n originY: 0.5\n },\n // open from middle, right\n 'left-start': {\n originX: 1,\n originY: 0\n },\n // open from top, right\n 'left-end': {\n originX: 1,\n originY: 1\n },\n // open from bottom, right\n overlay: {\n originX: 0.5,\n originY: 0.5\n } // open from center, center\n};\n\n/**\n * Given the floating-ui `placement`, compute the framer-motion props for the\n * popover's entry animation.\n *\n * @param placement A placement string from floating ui\n * @return The object containing the motion props\n */\nexport const placementToMotionAnimationProps = placement => {\n const translateProp = placement.startsWith('top') || placement.startsWith('bottom') ? 'translateY' : 'translateX';\n const translateDirection = placement.startsWith('top') || placement.startsWith('left') ? 1 : -1;\n return {\n style: PLACEMENT_TO_ANIMATION_ORIGIN[placement],\n initial: {\n opacity: 0,\n [translateProp]: `${DROPDOWN_MOTION.SLIDE_DISTANCE * translateDirection}px`\n },\n animate: {\n opacity: 1,\n [translateProp]: 0\n },\n transition: {\n opacity: {\n duration: DROPDOWN_MOTION.FADE_DURATION / 1000,\n ease: DROPDOWN_MOTION.FADE_EASING.function\n },\n [translateProp]: {\n duration: DROPDOWN_MOTION.SLIDE_DURATION / 1000,\n ease: cubicBezier(...DROPDOWN_MOTION.SLIDE_EASING.args)\n }\n }\n };\n};\nfunction isTopBottom(anchorRef) {\n return !!anchorRef?.top;\n}\nfunction isRef(anchorRef) {\n return !!anchorRef?.current;\n}\nexport const getReferenceElement = ({\n anchor,\n anchorRef,\n anchorRect,\n getAnchorRect,\n fallbackReferenceElement\n}) => {\n let referenceElement = null;\n if (anchor) {\n referenceElement = anchor;\n } else if (isTopBottom(anchorRef)) {\n // Create a virtual element for the ref. The expectation is that\n // if anchorRef.top is defined, then anchorRef.bottom is defined too.\n // Seems to be used by the block toolbar, when multiple blocks are selected\n // (top and bottom blocks are used to calculate the resulting rect).\n referenceElement = {\n getBoundingClientRect() {\n const topRect = anchorRef.top.getBoundingClientRect();\n const bottomRect = anchorRef.bottom.getBoundingClientRect();\n return new window.DOMRect(topRect.x, topRect.y, topRect.width, bottomRect.bottom - topRect.top);\n }\n };\n } else if (isRef(anchorRef)) {\n // Standard React ref.\n referenceElement = anchorRef.current;\n } else if (anchorRef) {\n // If `anchorRef` holds directly the element's value (no `current` key)\n // This is a weird scenario and should be deprecated.\n referenceElement = anchorRef;\n } else if (anchorRect) {\n // Create a virtual element for the ref.\n referenceElement = {\n getBoundingClientRect() {\n return anchorRect;\n }\n };\n } else if (getAnchorRect) {\n // Create a virtual element for the ref.\n referenceElement = {\n getBoundingClientRect() {\n const rect = getAnchorRect(fallbackReferenceElement);\n return new window.DOMRect(rect.x ?? rect.left, rect.y ?? rect.top, rect.width ?? rect.right - rect.left, rect.height ?? rect.bottom - rect.top);\n }\n };\n } else if (fallbackReferenceElement) {\n // If no explicit ref is passed via props, fall back to\n // anchoring to the popover's parent node.\n referenceElement = fallbackReferenceElement.parentElement;\n }\n\n // Convert any `undefined` value to `null`.\n return referenceElement ?? null;\n};\n\n/**\n * Computes the final coordinate that needs to be applied to the floating\n * element when applying transform inline styles, defaulting to `undefined`\n * if the provided value is `null` or `NaN`.\n *\n * @param c input coordinate (usually as returned from floating-ui)\n * @return The coordinate's value to be used for inline styles. An `undefined`\n * return value means \"no style set\" for this coordinate.\n */\nexport const computePopoverPosition = c => c === null || Number.isNaN(c) ? undefined : Math.round(c);"],
"mappings": "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",
"names": []
}