Blame view

天文台pc/tianwentai-ui/node_modules/framer-motion/dist/es/components/AnimatePresence/PopChild.mjs 4.01 KB
bc518174   王天杨   提交两个项目文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
  "use client";
  import { jsx } from 'react/jsx-runtime';
  import { isHTMLElement } from 'motion-dom';
  import * as React from 'react';
  import { useId, useRef, useContext, useInsertionEffect } from 'react';
  import { MotionConfigContext } from '../../context/MotionConfigContext.mjs';
  import { useComposedRefs } from '../../utils/use-composed-ref.mjs';
  
  /**
   * Measurement functionality has to be within a separate component
   * to leverage snapshot lifecycle.
   */
  class PopChildMeasure extends React.Component {
      getSnapshotBeforeUpdate(prevProps) {
          const element = this.props.childRef.current;
          if (isHTMLElement(element) && prevProps.isPresent && !this.props.isPresent && this.props.pop !== false) {
              const parent = element.offsetParent;
              const parentWidth = isHTMLElement(parent)
                  ? parent.offsetWidth || 0
                  : 0;
              const parentHeight = isHTMLElement(parent)
                  ? parent.offsetHeight || 0
                  : 0;
              const computedStyle = getComputedStyle(element);
              const size = this.props.sizeRef.current;
              size.height = parseFloat(computedStyle.height);
              size.width = parseFloat(computedStyle.width);
              size.top = element.offsetTop;
              size.left = element.offsetLeft;
              size.right = parentWidth - size.width - size.left;
              size.bottom = parentHeight - size.height - size.top;
          }
          return null;
      }
      /**
       * Required with getSnapshotBeforeUpdate to stop React complaining.
       */
      componentDidUpdate() { }
      render() {
          return this.props.children;
      }
  }
  function PopChild({ children, isPresent, anchorX, anchorY, root, pop }) {
      const id = useId();
      const ref = useRef(null);
      const size = useRef({
          width: 0,
          height: 0,
          top: 0,
          left: 0,
          right: 0,
          bottom: 0,
      });
      const { nonce } = useContext(MotionConfigContext);
      /**
       * In React 19, refs are passed via props.ref instead of element.ref.
       * We check props.ref first (React 19) and fall back to element.ref (React 18).
       */
      const childRef = children.props?.ref ??
          children?.ref;
      const composedRef = useComposedRefs(ref, childRef);
      /**
       * We create and inject a style block so we can apply this explicit
       * sizing in a non-destructive manner by just deleting the style block.
       *
       * We can't apply size via render as the measurement happens
       * in getSnapshotBeforeUpdate (post-render), likewise if we apply the
       * styles directly on the DOM node, we might be overwriting
       * styles set via the style prop.
       */
      useInsertionEffect(() => {
          const { width, height, top, left, right, bottom } = size.current;
          if (isPresent || pop === false || !ref.current || !width || !height)
              return;
          const x = anchorX === "left" ? `left: ${left}` : `right: ${right}`;
          const y = anchorY === "bottom" ? `bottom: ${bottom}` : `top: ${top}`;
          ref.current.dataset.motionPopId = id;
          const style = document.createElement("style");
          if (nonce)
              style.nonce = nonce;
          const parent = root ?? document.head;
          parent.appendChild(style);
          if (style.sheet) {
              style.sheet.insertRule(`
            [data-motion-pop-id="${id}"] {
              position: absolute !important;
              width: ${width}px !important;
              height: ${height}px !important;
              ${x}px !important;
              ${y}px !important;
            }
          `);
          }
          return () => {
              ref.current?.removeAttribute("data-motion-pop-id");
              if (parent.contains(style)) {
                  parent.removeChild(style);
              }
          };
      }, [isPresent]);
      return (jsx(PopChildMeasure, { isPresent: isPresent, childRef: ref, sizeRef: size, pop: pop, children: pop === false
              ? children
              : React.cloneElement(children, { ref: composedRef }) }));
  }
  
  export { PopChild };
  //# sourceMappingURL=PopChild.mjs.map